gcc 4.8.0 添加了 thread_local
来自 C++11 标准的实现。更改状态可能存在“运行时惩罚” :
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
inworker
会产生开销吗?还是这样,即使它是start
开始的worker
?