5

我有以下使用线程和静态变量初始化的 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; 
}
4

1 回答 1

8

该代码将按照您的预期进行。见§6.7.4

静态局部变量是:

...在第一次控制通过其声明时初始化...如果在初始化变量时控制同时进入声明,则并发执行将等待初始化完成。

换句话说,编译器确保您的线程在静态局部变量的初始化上进行协作。它们每个都将被初始化一次,并且每个线程只有在完全初始化后才能访问该对象。

编译器只会在使用thread_local关键字显式请求时创建线程局部变量。

于 2011-10-18T15:37:17.593 回答