什么时候初始化`thread_local`全局变量?

时间:2014-06-16 23:17:14

标签: c++ multithreading c++11 thread-local

考虑以下示例(为简单起见,省略cout上的锁定保护)。

#include <future>
#include <iostream>
#include <thread>

using namespace std;

struct C
{
  C() { cout << "C constructor\n";}
  ~C() { cout << "C destructor\n";}
};

thread_local C foo;

int main()
{
   int select;
   cin >> select;
   future<void> f[10];
   for ( int i = 0;i < 10; ++i)
       f[i] = async( launch::async,[&](){ if (select) foo; } );
   return 0;
}

在clang和gcc上,如果用户写入&#39; 0&#39;,则该程序不输出任何内容,而如果用户输入非零数字,则打印Constructor / Destructor 10次。 另外clang抱怨明显的非使用表达结果。

由于thread_local存储生命周期应该跨越整个线程的生命周期,我期望在每个线程中初始化foo变量,而不管用户输入如何。

我可能想要一个thread-local变量,其唯一目的是在构造函数中产生副作用,标准是否要求thread_local对象在首次使用时初始化?

1 个答案:

答案 0 :(得分:18)

该标准允许此行为,但它并不能保证。从3.7.2 / 2 [basic.stc.thread]:

  

具有线程存储持续时间的变量应在之前初始化   它的第一次使用(3.2),如果构造,将被销毁   线程退出。

也可能在某些其他时间(例如在程序启动时)构建对象,在第一次使用之前#34;&#34;意味着&#34;任何时候,只要它在&#34;之前。而不是&#34;就在#34;。

之前