蒙泰罗C++11静态变量构造线程安全
在c++11中,static静态类对象在执⾏构造函数进⾏初始化的过程是线程安全的。
#include
#include
using namespace std;
class Cnum
{
public:
Cnum()
{
std::cout << “construct start” << std::endl;
幼儿涂色画图片大全
std::this_thread::sleep_for(std::chrono::conds(5)); //构造函数中休眠5s
num++;
桩身完整性检测
std::cout << “construct stop” << std::endl;
}
咖啡介绍
void Test()
{
std::cout << “id:” << std::this_thread::get_id() << “,num=” << num << std::endl;
std::this_thread::sleep_for(std::chrono::conds(1));
}
static int num;
};
lv包真假>皮衣发霉怎么办
int Cnum::num = 0; //初始化静态成员
void func(void* argv)
{
int i = *(int *)argv;
std::cout << i << std::endl; //每个线程启动时,打印线程次序号
static Cnum a; //内部静态成员变量的初始化时线程安全的,只有⼀个线程能执⾏初始化,其他线程会在此阻塞a.Test();
}
void main()
{
for (int i = 0; i < 10; i++) //开启10个线程,模拟并发访问情形
{
背影儿
std::thread t1(func, (void *)&i);
t1.detach();
}
system("pau ");//暂停⼀下
鸭梨的功效与作用}
运⾏结果:
在结果中,可以看到i在循环打印,但"construct start"、"construct stop"都只打印⼀次,说明当有⼀个线程进⾏构造,其他线程再也不会进⾏构造,且被阻塞等待构造完成,再往下执⾏,id表明不同线程,num表明构造值进⾏⼀次