2

gcc 4.8.0 添加了 thread_local来自 C++11 标准的实现。更改状态可能存在“运行时惩罚” :

G++ 现在实现了 C++11thread_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();
}

现在使用datainworker会产生开销吗?还是这样,即使它是start开始的worker

4

0 回答 0