gcc 4.8.0在C ++ 11 Standard中添加了thread_local
的实现。
Changes表示可能存在“暂时运行”:
G ++现在实现了C ++ 11
thread_local
关键字; [...]不幸的是,这种支持要求对不同翻译单元中定义的非功能本地thread_local
变量的引用进行运行时惩罚,即使它们不需要动态初始化,[...]。如果程序员可以确定在非定义的TU中不使用该变量需要触发动态初始化(或者因为该变量是静态初始化的,或者在定义TU之前使用该变量将在任何之前执行使用另一个TU),他们可以使用-fno-extern-tls-init选项避免这种开销。
有人能解释一下G ++对thread_local
全局变量的作用吗?
从更改说明中我假设例如这不会产生开销:
thread_local Data data { 1000 };
void worker() {
for(auto &elem : data)
elem.calulcate();
}
因为data
位于同一个翻译单元中?
如果worker
和data
位于不同的翻译单元中,这会如何变化?这是一个例子吗?
// module.cpp
void worker();
thread_local Data data { 1000 };
void start() {
worker();
}
// main.cpp
extern thread_local Data data; // correct decl?
void worker() {
for(auto &elem : data)
elem.calulcate();
}
现在data
中使用worker
会导致开销吗?情况是否仍然如此,即使是start
开始worker
?