当前位置: 首页 > news >正文

基于CAS操作的atomic原子类型

在上一节的卖票程序中,我们讲解了如何在多线程中保证临界资源的正确访问——使用互斥锁,即

lock_guard<mutex> lock(mtx);
count++;lock_guard<mutex> lock(mtx);
count--;

从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用-CSDN博客

但是互斥锁是比较重的,临界区代码做的事情比较多,它涉及到系统调用和上下文的切换,在高并发的情况下可能会带来一定的性能影响。而原子操作通常在硬件层面实现,其执行速度更快,且不需要上下文的切换 

因此,当临界区仅仅只是一个变量而不是一段代码时,使用原子类型的效率比互斥锁要高

以下示例:

#include<iostream>
#include<thread>
#include<list>
#include<atomic>
using namespace std;volatile atomic_bool isReady(false);
volatile atomic_int mycount(0);void task()
{while(!isReady){std::this_thread::yield();//线程让出cpu时间,等待调度}for(int i=0;i<100;i++){mycount++;}
}int main()
{list<std::thread> tlist;for(int i=0;i<9;i++){tlist.push_back(thread(task));}isReady=true;for(auto& td:tlist){td.join();}cout<<mycount<<endl;return 0;
}

上述volatile关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。

volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值

http://www.lryc.cn/news/300934.html

相关文章:

  • Rust HashMap详解及单词统计示例
  • 命令执行讲解和函数
  • 外包实在是太坑了,划水三年,感觉人都废了
  • 代码随想录算法训练营第19天
  • 树莓派5 EEPROM引导加载程序恢复镜像
  • 循序渐进-讲解Markdown进阶(Mermaid绘图)-附使用案例
  • 寒假作业2月6号
  • ChatGPT绘图指南:DALL.E3玩法大全(一)
  • 计算机服务器中了_locked勒索病毒怎么办?Encrypted勒索病毒解密数据恢复
  • VueCLI核心知识3:全局事件总线、消息订阅与发布
  • Redis中缓存问题
  • 数码管扫描显示-单片机通用模板
  • IDEA中的神仙插件——Smart Input (自动切换输入法)
  • shell编程:求稀疏数组中元素的和(下标不连续)
  • Rust 学习笔记 - 详解数据类型
  • 构建本地yum源
  • 常用的正则表达式,收藏必备!!!
  • js---webAPI
  • git的常用命令有哪些?
  • 《动手学深度学习(PyTorch版)》笔记8.5
  • 【蓝桥杯单片机入门记录】LED灯(附多个例程)
  • c语言简单json库
  • Linux操作系统基础(七):Linux常见命令(二)
  • 进程状态
  • STM32固件库简介与使用指南
  • 【开源】SpringBoot框架开发智能教学资源库系统
  • 融资项目——获取树形结构的数据
  • Crypto-RSA2
  • IEEE Internet of Things Journal投稿经验
  • 实例分割论文阅读之:FCN:《Fully Convolutional Networks for Semantica Segmentation》