【发布时间】:2019-01-19 18:41:21
【问题描述】:
我刚刚遇到了这种为每个线程运行一次代码的技术。我不知道它在最低级别是如何工作的。特别是,fs 指的是什么? .zero 8 是什么意思?标识符为@tpoff 是否有原因?
int foo();
void bar()
{
thread_local static auto _ = foo();
}
输出(带-O2):
bar():
cmp BYTE PTR fs:guard variable for bar()::_@tpoff, 0
je .L8
ret
.L8:
sub rsp, 8
call foo()
mov BYTE PTR fs:guard variable for bar()::_@tpoff, 1
add rsp, 8
ret
guard variable for bar()::_:
.zero 8
【问题讨论】:
-
似乎 GCC 正在使用每个线程变量来跟踪
_的状态。如果已经设置,它不会再次初始化它。 -
除了 Peter Cordes 所说的不使用
_作为变量名之外,我还建议不要在示例中使用main,以显示编译器生成的汇编代码。函数main在很多方面都很特别,虽然在这里它不是一个真正的问题,但编译器可以为 main 生成不同的代码,而不是它被命名为其他东西。特别是main在 C++ 中只能调用一次,因此编译器可以忽略 thread_local 属性或不使用保护变量。 -
哦,真的。既然你提到它,那绝对是个坏主意。
标签: c++ multithreading gcc assembly thread-local-storage