线程局部全局范围变量

时间:2014-07-11 15:34:11

标签: c++ multithreading storage-duration

请考虑以下代码:

#include <iostream>
#include <thread>

using std::cout;
using std::thread;

thread_local int a;

void foo()
{
    a = a + 1;
    cout  << a << "\n";
}

void bar()
{
    cout << a << "\n";
}

void baz()
{
    cout << "Something\n";
}

int main()
{
    thread first(foo);
    thread second(bar);
    thread third(baz);
    second.join();
    first.join();
    third.join();
    cout << a;
}

Demo

由于a具有线程存储持续时间,因此我们至少有三个不同的对象,用a表示并在firstsecondmain个线程中使用。我们不在a内使用third。是否有零初始化a可用于第三个?我问这个问题是因为我在标准中找不到任何相关内容:

  

具有线程存储持续时间的非局部变量初始化为a   线程执行的结果。

是否定义了实施?

1 个答案:

答案 0 :(得分:2)

N3337,3.7.2.2

  

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

3.2.2太长了,无法复制到这里,但实际上,如果它没有出现在已执行的代码中,它就不能“使用”。所以它不是(必然)用某种东西初始化。