Xan*_*lip 5 multithreading initialization static-members memory-model c++11
我有以下一些使用线程和静态变量初始化的C++ 11代码.我的问题是:
什么担保或保证,不C++语言做出静态变量的单初始化 - 下面的代码显示了正确的价值观,但我似乎无法找到在新标准中提到的内存模型应如何线程交互的通道.如果变量变为线程本地?
#include <iostream>
#include <thread>
class theclass
{
public:
theclass(const int& n)
:n_(n)
{ printf("aclass(const int& n){}\n"); }
int n() const { return n_; }
private:
int n_;
};
int operator+(const theclass& c, int n)
{
return c.n() + n;
}
void foo()
{
static theclass x = 1;
static theclass y = x + 1;
printf("%d %d\n",x.n(),y.n());
}
int main()
{
std::thread t1(&foo);
std::thread t2(&foo);
t1.join();
t2.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码将按照您的期望进行.见§6.7.4
静态局部变量是:
...初始化第一次控制传递其声明...如果控件在初始化变量时同时进入声明,则并发执行应等待初始化完成.
换句话说,编译器确保您的线程在静态本地的初始化上合作.它们将被初始化一次,每个线程只有在完全初始化后才能访问该对象.
编译器仅在使用thread_local关键字显式请求时才创建线程局部变量.