gpt4 book ai didi

multithreading - C++ 静态变量初始化和线程

转载 作者:行者123 更新时间:2023-12-04 17:56:37 25 4
gpt4 key购买 nike

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

最佳答案

代码会做你期望的事情。见第 6.7.4 节

静态局部变量是:

... initialized the first time control passes over its declaration ... If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.



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

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

关于multithreading - C++ 静态变量初始化和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com