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

C++11原子操作详解

C11原子操作原子操作的概念所谓原子操作其意义就是“原子是最小的不可分割的最小个体”。**表示当多个线程访问同一个全局资源的时候能够确保所有其它的线程都不在同一时间访问相同的资源。**也就是它确保在同一时刻只有唯一的线程对这个资源进行访问。类似于共享资源的访问保护。但是原子操作更加接近底层即效率更高。在以往C中没有原子操作的规定更多使用的都是汇编语言或者借助第三方库如Intel的pthread来实现。但在C11中的特性引入原子操作的相关概念并通过新的头文件提供了多种原子操作数据类型。如atomic_boolatomic_int等。如果需要多个线程对这些类型的共享资源进行操作编译器将保证这些操作都是具有原子性的。通俗地说就是确保在任意时刻只有一个线程对这个资源进行访问编译器将保证多个线程访问这个资源的正确性从而避免锁的使用提高效率。示例1234567891011121314151617181920212223242526#include iostream#include thread//C11线程库且跨平台#include windows.h//Sleep函数需要使用的库文件usingstd::cout;usingstd::endl;usingstd::cin;intg_total 0;voidclick(){for(inti 0; i 1000000; i){g_total;}}intmain(){for(inti 0; i 4; i){std::threadt(click);t.detach();}Sleep(1000);cout result: g_total endl;return0;}我们很正常的认为这样做是可以提高CPU的利用效率的但是实际上执行结果并不正确。紧接着我们肯定想到使用互斥锁对共享资源进行保护。12345678910111213141516171819202122232425262728293031#include iostream#include thread//C11线程库是跨平台的#include mutex//C11互斥锁#include windows.h//Sleep函数需要使用的库文件usingstd::cout;usingstd::endl;usingstd::cin;intg_total 0;std::mutex g_mutex;voidclick(){for(inti 0; i 1000000; i){g_mutex.lock();//访问之前锁定互斥对象g_total;g_mutex.unlock();//访问之后释放互斥对象}}intmain(){for(inti 0; i 4; i){std::threadt(click);t.detach();}Sleep(1000);cout result: g_total endl;return0;}初始对象的使用保证同一时刻只有唯一一个线程对这个共享对象进行访问。在C11之前互斥锁的概念已经足够了但是在C11提出之后进一步利用CPU性能。在C11中实现了原子操作的数据类型如atomic_boolatomic_int等。使用原子操作的数据类型线程对其进行访问的时候无需借助mutex等锁机制也能实现对共享资源的正确访问。1234567891011121314151617181920212223242526272829#include iostream#include thread//C11线程库是跨平台的#include atomic//C11原子操作库#include windows.h//Sleep函数需要使用的库文件usingstd::cout;usingstd::endl;usingstd::cin;std::atomic_int g_total 0;//使用原子操作的数据类型voidclick(){for(inti 0; i 1000000; i){//mutex.lock();g_total;//mutex.unlock();}}intmain(){for(inti 0; i 4; i){std::threadt(click);t.detach();}Sleep(1000);cout result: g_total endl;return0;}总结本篇文章就到这里了希望能够给你带来帮助
http://www.rkmt.cn/news/1294839.html

相关文章:

  • 智能编程协作系统claude-codex-duo:架构解析与实战指南
  • 别再混装了!一次讲清Linux服务器上LibreOffice与OpenOffice的兼容性陷阱
  • Unlock Music:12种加密音乐格式一键解锁的终极解决方案
  • 3步彻底解决Honey Select 2日文困扰:HS2-HF_Patch汉化补丁终极指南
  • Wedecode深度解析:微信小程序二进制包逆向工程的技术实现路径
  • 5分钟安装!这款免费Chrome扩展让你的视频永远悬浮播放,工作学习效率翻倍
  • Go语言结构化错误处理实践:xerrors/Yuxi库的设计与应用
  • 哈尔滨正规代理记账公司排行 本地合规服务商盘点 - 奔跑123
  • D2RML:暗黑破坏神2重制版多开终极指南,告别繁琐登录流程
  • VSCode中AI代码补全工具在Verilog/SystemVerilog硬件设计中的实战应用
  • 怎么从AI里导出、复制出排版整齐、格式不乱的文字? - AI导出鸭
  • 152.不用瞎找资料!YOLOv8(Ultralytics)完整代码,复制粘贴就能跑通
  • .Net基于NetCoreKevin框架 AI 与 Hangfire 集成:实现AI智能自动任务调度
  • 跨镜跟踪技术迭代:ReID 落幕,镜像视界无感定位领航技术迭代的浪潮
  • 基于RAG架构的智能知识库实践:用大语言模型增强Obsidian笔记
  • 航空器配载与货运管理系统blog
  • 容器化自动化数据抓取平台OpenClaw-Compose部署与实战指南
  • Windows驱动管理终极指南:DriverStore Explorer完全使用手册,轻松解决磁盘空间和驱动冲突问题
  • 8B模型做生物实验:实验步骤顺序不乱、剂量无幻觉|ICLR 2026
  • 开源机械爪资源宝库:从入门到进阶的完整实践指南
  • Need is all you need:AI接手Coding后,程序员最值钱的能力只剩这一项?
  • Rusted PackFile Manager:全面战争模组制作的终极免费工具
  • 从悬空引脚到复用设计:LPDDR3地址线BA0-BA3的工程逻辑探秘
  • FanControl终极指南:3步打造个性化电脑散热方案
  • XXMI启动器架构解析:基于Python的跨游戏模组管理平台实现原理
  • Go语言中的指针
  • 深圳卡地亚陶瓷表圈磕碰能修复?官方门店原厂级精修案例 - 亨得利官方维修中心
  • Vivado Clocking Wizard实战:从PLL/MCMM配置到多时钟域系统设计
  • 5大隐藏功能揭秘:Markor如何重塑Android移动文本创作生态
  • 蓝牙Mesh、Beacon都靠它:深入浅出图解蓝牙广播帧的8种类型与应用场景