linux线程 static,C++11中static类对象构造函数线程安全的验证

在C++11中,static静态类对象在执行构造函数进行初始化的过程是线程安全的,有了这个特征,我们可以自己动手轻松的实现单例类,关于如何实现线程安全的单例类,请查看C++:自己动手实现线程安全的C++单例类。下面给出一个验证例子:

1.清单1:staticSafe.h

#include

#include

using namespace std;

class Cnum

{

public:

Cnum()

{

std::cout << "construct start" << std::endl;

std::this_thread::sleep_for(std::chrono::seconds(5));  //构造函数中休眠5s

num++;

std::cout << "construct stop" << std::endl;

}

void Test()

{

std::cout << "id:" << std::this_thread::get_id()<

std::this_thread::sleep_for(std::chrono::seconds(1));

}

static int num;

};

2. 清单2:main.cpp

int Cnum::num = 0;    //初始化静态成员

void func(void* argv)

{

int i = *(int *)argv;

std::cout <

static Cnum a;  //内部静态成员变量的初始化时线程安全的,只有一个线程能执行初始化,其他线程会在此阻塞

a.Test();

}

void main()

{

for (int i = 0; i < 10; i++)    //开启10个线程,模拟并发访问情形

{

std::thread t1(func, (void *)&i);

t1.detach();

}

system("pause ");//暂停一下

}

3. 运行结果

e78e092d1f70eafbd200010d27e1e1dd.png

从结果中可以看出:1)当打印“construct stop” 以后,其他线程才陆续执行Test函数  2) 所有线程打印的num为1。以上现象表明:当有一个线程执行static类对象的构造函数时,其他欲访问该static类对象的线程都是阻塞的。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值