Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading C++;静态变量初始化和线程_Multithreading_Initialization_C++11_Static Members_Memory Model - Fatal编程技术网

Multithreading C++;静态变量初始化和线程

Multithreading C++;静态变量初始化和线程,multithreading,initialization,c++11,static-members,memory-model,Multithreading,Initialization,C++11,Static Members,Memory Model,我有下面一段使用线程和静态变量初始化的C++11代码。我的问题是: < C++语言对静态变量的初始化有什么保证或保证?下面的代码显示正确的值,但是我似乎找不到新标准中的一个段落,它提到了内存模型应该如何与线程交互。变量何时变成线程本地的 #include <iostream> #include <thread> class theclass { public: theclass(const int& n) :n_(n) { printf("ac

我有下面一段使用线程和静态变量初始化的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; 
}
#包括
#包括
分类
{
公众:
类(常量内部和外部)
:n(n)
{printf(“aclass(const int&n){}\n”);}
int n()常量{return n_;}
私人:
int n_;
};
整数运算符+(常量类&c,整数n)
{
返回c.n()+n;
}
void foo()
{
静态类x=1;
静态类y=x+1;
printf(“%d%d\n”,x.n(),y.n());
}
int main()
{
std::线程t1(&foo);
标准:螺纹t2(&foo);
t1.join();
t2.连接();
返回0;
}

该代码将实现您所期望的功能。见§6.7.4

静态局部变量包括:

。。。控件第一次传递其声明时已初始化。。。 如果控件在变量为 初始化后,并发执行应等待完成 初始化的一部分

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

编译器仅在使用
thread\u local
关键字显式请求时才会创建线程局部变量