Здравствуйте, rg45, Вы писали:
R>Похоже на какую-то оптимизацию. А не пробовал добавить какую-нибудь искусственную зависимость — фейковую функцию-член, например, и как-то прикрутить ее вызов к основному потоку?
Чего только не пробовал, не помогает. Только непосредственное обращение к объекту и именно в Runtime. Т.е. конструктор thread_local объекта получается никак не вызвать, если поток не обращается к объекту.
Дурость какая-то, перед каждым обращение к объекту вставляется безусловный вызов __tls_init() и внутри проверяется флаг и если уже вызывали, то проскакивает, если нет то вызывает конструктор. Вот ассемблер:
__tls_init():
0x000055555577a355 endbr64
0x000055555577a359 push %rbp
0x000055555577a35a mov %rsp,%rbp
0x000055555577a35d movzbl %fs:0xffffffffffffffe0,%eax
0x000055555577a366 xor $0x1,%eax
0x000055555577a369 test %al,%al
0x000055555577a36b je 0x55555577a3bf <__tls_init()+106>
0x000055555577a36d movb $0x1,%fs:0xffffffffffffffe0
0x000055555577a376 mov %fs:0x0,%rax
0x000055555577a37f add $0xffffffffffffffd0,%rax
0x000055555577a385 lea 0x173434(%rip),%rdx # 0x5555558ed7c0 <_ZN5htlib2v2L10g_queueMapE>
0x000055555577a38c mov %rdx,%rsi
0x000055555577a38f mov %rax,%rdi
0x000055555577a392 call 0x55555577a238 <_ZN5htlib2v217SlotContextHolderC2ERNS0_12SlotQueueMapE>
0x000055555577a397 mov %fs:0x0,%rax
0x000055555577a3a0 add $0xffffffffffffffd0,%rax
0x000055555577a3a6 lea 0x16fc5b(%rip),%rdx # 0x5555558ea008
0x000055555577a3ad mov %rax,%rsi
0x000055555577a3b0 lea -0xf7(%rip),%rax # 0x55555577a2c0 <_ZN5htlib2v217SlotContextHolderD2Ev>
0x000055555577a3b7 mov %rax,%rdi
0x000055555577a3ba call 0x5555555704e0 <__cxa_thread_atexit@plt>
0x000055555577a3bf nop
0x000055555577a3c0 pop %rbp
0x000055555577a3c1 ret