Здравствуйте, rg45, Вы писали:
R>А ты не рассматриваешь вариант, что это проделки линкера, а не компилера? Не может быть такого, что эти объекты определены в таких единицах трансляции в которых вообще нет никаких видимых связей с другими единицами трансляции и линкеры просто выкидывают весь объектник при линковке?
Не похоже, так как, thread_local объект объявляется в той же единицы трансляции что и static map в котором он регистрируется себя. thread_local конструктор вызывается главным потоком, не вызываются служебными. Кстати как я уже заметил, gcc вызывает конструктор thread_local объекта прямо перед первым обращением к нему, а такого обращения у меня нигде нет, т.к. я до этого предполагал, что thread_local подобен static объекту и взывает свой конструктор при старте потока, но оказывается это не так.
R>Это тостаточно известная проблема, которая обсуждалась и на РСДН, давненько правда. Она имеет достаточно простое решение — в каком-нибудь общем заколовочном файле определяют константу какого-нибудь класса, а конструктор этого класса определяют в той самой единице трансляции, которую нужно форсированно прилинковать. Зачастую такие классы приходится делать фейковыми, если ничего реального нет под рукой.
Вот эта техника у меня не работает с thread_local. Если нет к нему обращения именно в runtime из самого потока — объект в этом потоке не создается совсем. MSVC — делает по другому, логика похожа на static объекты.
Почему я решил спросить на форуме: во-первых уже много времени прошло, может стандарт как-то изменился в этом месте и можно с помощью атрибутов форсировать создание объекта