Re[2]: thread_local in C++17
От: Videoman Россия https://hts.tv/
Дата: 01.02.23 09:40
Оценка:
Здравствуйте, rg45, Вы писали:

R>А ты не рассматриваешь вариант, что это проделки линкера, а не компилера? Не может быть такого, что эти объекты определены в таких единицах трансляции в которых вообще нет никаких видимых связей с другими единицами трансляции и линкеры просто выкидывают весь объектник при линковке?


Не похоже, так как, thread_local объект объявляется в той же единицы трансляции что и static map в котором он регистрируется себя. thread_local конструктор вызывается главным потоком, не вызываются служебными. Кстати как я уже заметил, gcc вызывает конструктор thread_local объекта прямо перед первым обращением к нему, а такого обращения у меня нигде нет, т.к. я до этого предполагал, что thread_local подобен static объекту и взывает свой конструктор при старте потока, но оказывается это не так.

R>Это тостаточно известная проблема, которая обсуждалась и на РСДН, давненько правда. Она имеет достаточно простое решение — в каком-нибудь общем заколовочном файле определяют константу какого-нибудь класса, а конструктор этого класса определяют в той самой единице трансляции, которую нужно форсированно прилинковать. Зачастую такие классы приходится делать фейковыми, если ничего реального нет под рукой.


Вот эта техника у меня не работает с thread_local. Если нет к нему обращения именно в runtime из самого потока — объект в этом потоке не создается совсем. MSVC — делает по другому, логика похожа на static объекты.
Почему я решил спросить на форуме: во-первых уже много времени прошло, может стандарт как-то изменился в этом месте и можно с помощью атрибутов форсировать создание объекта
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.