请考虑以下代码:
#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;
}
由于a
具有线程存储持续时间,因此我们至少有三个不同的对象,用a表示并在first
,second
和main
个线程中使用。我们不在a
内使用third
。是否有零初始化a
可用于第三个?我问这个问题是因为我在标准中找不到任何相关内容:
具有线程存储持续时间的非局部变量初始化为a 线程执行的结果。
是否定义了实施?
答案 0 :(得分:2)
N3337,3.7.2.2
具有线程存储持续时间的变量应在之前初始化 它的第一次使用(3.2),如果构造,将被销毁 线程退出。
3.2.2太长了,无法复制到这里,但实际上,如果它没有出现在已执行的代码中,它就不能“使用”。所以它不是(必然)用某种东西初始化。