【问题标题】:C++ static variable inialization and threadsC++ 静态变量初始化和线程
【发布时间】:2011-10-17 05:56:07
【问题描述】:

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

【问题讨论】:

    标签: multithreading initialization c++11 static-members memory-model


    【解决方案1】:

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

    静态局部变量是:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2012-10-26
      • 2015-06-01
      相关资源
      最近更新 更多