目录
原子操作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),这样的代码更稳定