Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Не компилируется Код: plaintext Без наследования все нормально. Можно это как-то полечить не убирая = {0}? Такой вариант не очень подходит Код: plaintext 1. 2. 3. 4. 5. 6. Т.к. так медленнее код работает. С конструктором тоже. PS Пытаюсь асм посмотреть, но из-за thread_local вообще непонятно куда смотреть. PPS Можно через #define порешать, но не хотелось бы кашу в коде устраивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2017, 15:55 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
thread_local B b = {0,0}; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2017, 16:11 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
d7ithread_local B b = {0,0}; Не угадал :) Та же ошибка. Я так уже пробовал. PS в struct A только методы, если это принципиально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2017, 16:14 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Cerebrum Это фича с++20 Спасибо. Наколхозил с #define. Задача была thread_local заменить на TLS, чтобы код в DLL под XP работал. Думал по фэншую базовый класс сделаю, где с дефайнами пропишу оба варианта, а в остальном коде все красиво останется, унаследуюсь от этого класса и все. Но споткнулся об описанную проблему. Почему-то MSVC стал в более тормозной код генерить если конструктор добавить, хотя конструктор не часто вызывается, раз 10 в тесте, и очень много операций доступа к полям структуры, но как на это инициализация могла повлиять - непонятно. До асма не докопал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2017, 18:10 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Dima T, А какой смысл делать thread_local локальную переменную? Только глобальную или статическую вижу смысл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2017, 21:01 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyDima T, А какой смысл делать thread_local локальную переменную? Только глобальную или статическую вижу смысл. thread_local - глобальная для потока. Смысл в многопоточности, пилю свою библиотеку акторов, thread_local задействовал, но в DLL под XP не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2017, 21:12 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. это похоже на Код: plaintext 1. но только на уровне потока, а не всего приложения/процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2017, 21:19 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Dima T Код: plaintext 1. это похоже на Код: plaintext 1. но только на уровне потока, а не всего приложения/процесса. Похоже только. На самом деле при доступе к такой "переменной", внутри реализации вызывается функция получения адреса заведённой структуры из списков TLS, поэтому и заметно медленнее. 20858811 - верно, нельзя локальной переменной или членом класса её объявлять . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 07:54 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Похоже только. На самом деле при доступе к такой "переменной", внутри реализации вызывается функция получения адреса заведённой структуры из списков TLS, поэтому и заметно медленнее. Я про другие тормозаТест все тот же stress_test , этот код в lite_thread.h класс lite_actor_t Если заменить код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. на такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. То общая скорость работы падает на 4-8% (на разных процах запускал). Причем экземпляров создается штук 10, а обращений к членам класса - миллионы. Мистика какая-то от компилятора MSVC. Если кто захочет запустить: Количество используемых потоков (ядер проца) задается в stress_test.cpp #define CPU_MAX Скорость смотреть в строке "msg_send/sec" kealon(Ruslan) 20858811 - верно, нельзя локальной переменной или членом класса её объявлять . Не буду спорить, тут больше о том как правильно назвать. По сути thread_local это static переменная, но не одна, а по одной для каждого потока. ИМХО неудачное название придумали, понятнее было бы thread_static Объявить внутри класса можно так Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 09:17 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Dima TНе буду спорить, тут больше о том как правильно назвать. По сути thread_local это static переменная, но не одна, а по одной для каждого потока. ИМХО неудачное название придумали, понятнее было бы thread_static нет, физически она в куче располагается, а не по константному адресу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 09:51 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Dima TПочему-то MSVC стал в более тормозной код генерить если конструктор добавить, хотя конструктор не часто вызывается, раз 10 в тесте, и очень много операций доступа к полям структуры, но как на это инициализация могла повлиять - непонятно.в дебаге или релизе тормозит? имхо, корень проблемы в отличии POD-структур от честных классов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:33 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima TНе буду спорить, тут больше о том как правильно назвать. По сути thread_local это static переменная, но не одна, а по одной для каждого потока. ИМХО неудачное название придумали, понятнее было бы thread_static нет, физически она в куче располагается, а не по константному адресу В куче, но по константному адресу :) Как понимаю память под thread_local выделяется рантаймом при старте потока, т.е. все время работы потока переменная остается в одном и том же месте, а где выделяется - непринципиально, память она вся одинаковая. Я понял про что ты говоришь: чтобы получить адрес расположения в памяти надо сначала получить адрес, по которому лежит весь блок thread_local переменных данного потока, в отличии от static, который в сегменте данных расположен. За счет этого работа с thread_local будет медленнее чем со static. Но такое сравнение неуместно, т.к. одно другим не заменишь. Если в эти дебри не углубляться, а просто посмотреть на описание логики работы: https://rsdn.org/forum/info/FAQ.cpp.static При объявлении локальных переменных функции ключевое слово static означает, что переменная имеет статический класс памяти (static storage duration), т.е. существует в течение всего времени выполнения программы, в отличие от переменных с локальным классом памяти (automatic storage duration). то получается что про thread_local можно сказать тоже что про static, только с добавлением что в каждом потоке используется своя копия переменной. Я про это писал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:34 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
egorychDima TПочему-то MSVC стал в более тормозной код генерить если конструктор добавить, хотя конструктор не часто вызывается, раз 10 в тесте, и очень много операций доступа к полям структуры, но как на это инициализация могла повлиять - непонятно.в дебаге или релизе тормозит? имхо, корень проблемы в отличии POD-структур от честных классов В релизе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:36 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Dima T, исходя из этого описания выходит что не static, так как эти участки выделяются при создании потока и удаляются при завершении, а не присутствуют всегда при работе программы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:49 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Dima T Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Не компилируется Код: plaintext Без наследования все нормально. Можно это как-то полечить не убирая = {0}? thread_local так же как и static уже проинициализирован нулями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 10:52 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima T, исходя из этого описания выходит что не static, так как эти участки выделяются при создании потока и удаляются при завершении, а не присутствуют всегда при работе программы это статик уровня контекста исполнения. вот сдесь хорошо видно. FS сегмент указывает на thread блок. Если посмотреть на результат работы MSVC 2017 то там GS указывает на thread блок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 11:55 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
вЪюkealon(Ruslan)Dima T, исходя из этого описания выходит что не static, так как эти участки выделяются при создании потока и удаляются при завершении, а не присутствуют всегда при работе программы это статик уровня контекста исполнения. вот сдесь хорошо видно. FS сегмент указывает на thread блок. Если посмотреть на результат работы MSVC 2017 то там GS указывает на thread блок вот ж блин, отстал от жизни реально префикс сегментного дескриптора стали использовать, молодцы по идее тогда тормозов сильных не должно быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 12:08 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
но и ограничения суровые авторВ операционных системах Windows до Windows Vista __declspec(thread) имеет некоторые ограничения. Если библиотека DLL объявляет любые данные или объекты как __declspec(thread), это может привести к сбою защиты при динамической загрузке. После загрузки библиотеки DLL с помощью метода LoadLibrary всякий раз, когда код ссылается на данные __declspec (thread), происходит сбой в системе. Поскольку пространство глобальных переменных для потока выделяется во время выполнения, размер данного пространства основан на расчете требований приложению, а также требований всех библиотек DLL, которые привязываются статически. При использовании LoadLibrary невозможно расширить это пространство, чтобы объявлять локальные переменные потока с помощью __declspec(thread). Используйте API-интерфейсы TLS, такие как TlsAlloc, в вашей библиотеке DLL, чтобы выделить TLS, если DLL может загружаться с помощью LoadLibrary. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 12:12 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)но и ограничения суровые авторВ операционных системах Windows до Windows Vista __declspec(thread) имеет некоторые ограничения. Если библиотека DLL объявляет любые данные или объекты как __declspec(thread), это может привести к сбою защиты при динамической загрузке. После загрузки библиотеки DLL с помощью метода LoadLibrary всякий раз, когда код ссылается на данные __declspec (thread), происходит сбой в системе. Поскольку пространство глобальных переменных для потока выделяется во время выполнения, размер данного пространства основан на расчете требований приложению, а также требований всех библиотек DLL, которые привязываются статически. При использовании LoadLibrary невозможно расширить это пространство, чтобы объявлять локальные переменные потока с помощью __declspec(thread). Используйте API-интерфейсы TLS, такие как TlsAlloc, в вашей библиотеке DLL, чтобы выделить TLS, если DLL может загружаться с помощью LoadLibrary. Типа мы вас предупредили. И что будет при лениво загруженной библиотеке с thread_local? Любимый синий экран? Microsoft specific. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 12:52 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
вЪюthread_local так же как и static уже проинициализирован нулями. Действительно все так. Убрал, наследование скомпилировалось, тормозов не добавилось. Попробую дописать как изначально планировал. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 13:07 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)но и ограничения суровые авторВ операционных системах Windows до Windows Vista __declspec(thread) имеет некоторые ограничения. Если библиотека DLL объявляет любые данные или объекты как __declspec(thread), это может привести к сбою защиты при динамической загрузке. После загрузки библиотеки DLL с помощью метода LoadLibrary всякий раз, когда код ссылается на данные __declspec (thread), происходит сбой в системе. Поскольку пространство глобальных переменных для потока выделяется во время выполнения, размер данного пространства основан на расчете требований приложению, а также требований всех библиотек DLL, которые привязываются статически. При использовании LoadLibrary невозможно расширить это пространство, чтобы объявлять локальные переменные потока с помощью __declspec(thread). Используйте API-интерфейсы TLS, такие как TlsAlloc, в вашей библиотеке DLL, чтобы выделить TLS, если DLL может загружаться с помощью LoadLibrary. Собственно поэтому и мастерю велосипед с вызовом Tls* вместо thread_local. Как понимаю в XP лезет в несуществующую память и вылетает. Наступал уже на эти грабли 16963764 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 13:18 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Переделал на Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Все работает, нулями инициализируется, тормозов не добавилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 15:45 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Dima TВсе работает Поторопился хвастаться, под XP не работает :( Точнее EXE работает и с thread_local и с Tls*(), а DLL просто убивает процесс. И thread_local похоже тут ни при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 19:31 |
|
||
|
Наследование и инициализация
|
|||
|---|---|---|---|
|
#18+
Может кто объяснит или подскажет куда копать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Что происходит в XP DLL: первый MessageBox() срабатывает, после прога вылетает. Как я понимаю выделенная строчка должна отработать не при вызове si(), а при старте, т.е. в случае с DLL в момент ее загрузки в память. Поэтому MessageBox`ы должны вызываться один за другим, но ничего подобного, первый MessageBox есть, второго нет. Жесть какая-то. Мыслей нет, куда копать непонятно. В Win7 DLL все работает. PS MSVC2015, исходники могу дать. Так в ассемблере отладчик показывает, но я в нем слабо разбираюсь Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 20:06 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39534995&tid=2018070]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
160ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 278ms |
| total: | 539ms |

| 0 / 0 |
