Re[4]: thread_local in C++17
От: Videoman Россия https://hts.tv/
Дата: 01.02.23 10:06
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.