C++多线程 原子操作atomic



原子操作atomic[无锁技术]

  • 概念:指不可分割的状态,要么完成要么没完成不能是完成和没完成的叠加态
  • 不需要用互斥量加🔒达到访问共享资源的技术
  • 只能针对变量的 原子操作 效率比 互斥量 更胜一筹
  • 只能处理变量值的增减读写,过于复杂不能处理【一般用于计数和统计等】
  • 适应场合:针对的是一个变量(而不是代码段),包括
    bool、char、 int、long、long long和指针类型(不支持浮点型和自定义数据类型)

atomic 原子操作过程

atomic <int>  num = 0 ;//封装具有原子操作类型为int的变量
void zijia() 
{
	//原子操作过程(不用加🔒了)
	for (int i = 0; i < 1000000; i++) {
		num++;//这个操作时原子操作,操作不会被打断
		//num =num+1;//不支持这个
	}
}

在这里插入图片描述

互斥量 达到原子操作过程

  • 不加锁答案会 <= 2000000
  • 适应场合:互斥量加锁 一般针对一个代码或者几行代码

在这里插入图片描述

atomic其他注意事项

atomic允许(不会出错)的操作符【简单就是美】

允许的
++,–,+=,-=,&=,|=,=


不允许的
num = num-1;
num = num+1;
num = num*2;
num = num/2;
等等型如此的


atomic其他函数暂时到此后续会进行补充

load 以原子方式【读】原子对象的值

代码:  
	atomic <int> res_1(res_0.load());
	cout << res_1 << endl;
	auto res_2(res_0.load());
	cout << res_2 << endl;

在这里插入图片描述

store以原子方式【写】入数据

//代码
atomic <int> res_0 = 0;
atomic <int> temp = 0;
res_0.store(temp);
res_0 = temp;//也可以这样

在这里插入图片描述

线程池引入

  • 不能为每一个客户端创建线程(创建10k个线程不现实)
  • 程序稳定性问题(若创建线程失败可能会异常)

  • 基于上面但不限于的原因引出线程池
    概念:把一堆线程弄到一起,统一管理,(用的时候拿出来,不用的时候再仍到线程池中,不释放),这种循环利用线程的方式为线程池

线程池实现方式

  • 程序启动时,一次性创建一定数量的线程,用完不销毁(while),这样的代码更稳定

代码问题后续单独实现

5

总结

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值