Gnu C ++ 4.8 thread_local实现背后的机制是什么?有什么确切的“运行时惩罚”?

时间:2013-03-23 13:37:06

标签: c++ gcc c++11 thread-local gcc4.8

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位于同一个翻译单元中?

如果workerdata位于不同的翻译单元中,这会如何变化?这是一个例子吗?

// 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

0 个答案:

没有答案