全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++原子操作(atomic)怎么用_c++多线程同步与无锁编程【进阶】

原子操作(std::atomic)是C++无锁同步核心,保证读-改-写不可分割;支持load/store/exchange/CAS等操作及内存序控制,适用于计数器、栈等场景,但需规避非平凡类型、ABA问题与误用relaxed序等陷阱。

原子操作(std::atomic)是 C++ 多线程中实现无锁同步的核心工具,它保证对变量的读-改-写操作不可分割,避免竞态条件,同时比互斥锁更轻量、更适合高频访问场景。

基础用法:声明与常用操作

使用 std::atomic 替代普通变量,支持整型、指针、布尔等可平凡复制(trivially copyable)类型。常见操作包括:

  • load():原子读取,可指定内存序(如 memory_order_relaxed
  • store(val):原子写入
  • exchange(val):原子交换并返回旧值
  • compare_exchange_weak/strong(expected, desired):CAS(Compare-And-Swap),无锁编程基石
  • 对整型还支持 fetch_addfetch_suboperator++ 等复合操作

示例:

  std::atomic counter{0};
  counter.fetch_add(1, std::memory_order_relaxed); // 线程安全自增

内存序(memory_order)怎么选?

内存序控制编译器重排和 CPU 指令重排,直接影响性能与正确性。日常开发中优先按语义选,而非盲目追求最弱序:

  • memory_order_relaxed:仅保证该操作原子,不约束前后指令顺序。适用于计数器、标记位等无需同步其他数据的场景
  • memory_order_acquire:用于读操作,保证其后所有读写不被重排到它前面。常配对 release 实现“获取-释放”同步
  • memory_order_release:用于写操作,保证其前所有读写不被重排到它后面。典型用于发布共享数据
  • memory_order_acq_rel:读-改-写操作(如 fetch_add)兼有 acquire 和 release 语义
  • memory_order_seq_cst(默认):最强一致性,全局顺序一致,最安全也最慢。不确定时先用它,再逐步优化

用 CAS 实现无锁栈(Lock-Free Stack)

CAS 是构建无锁数据结构的关键。下面是一个简化版的无锁单链栈(仅演示核心逻辑,省略内存回收):

  struct Node {
    int data;
    Node* next;
  };
  std::atomic head{nullptr};

  void push(int val) {
    Node* node = new Node{val, nullptr};
    node->next = head.load(std::memory_order_relaxed);
    while (!head.compare_exchange_weak(node->next, node,
                                                                 std::memory_order_release,
                                                                 std::memory_order_relaxed)) {
      // 若 head 已被其他线程修改,更新 node->next 并重试
    }
  }

注意:compare_exchange_weak 可能因 ABA 问题虚假失败,需循环重试;实际项目中还需配合 hazard pointer 或 RCU 解决内存回收问题。

常见陷阱与建议

  • 不要对非平凡类型使用 atomic:如 std::atomic<:string> 不合法,只能用于 POD 类型或满足 trivially copyable 的自定义结构
  • 避免误用 relaxed 序导致逻辑错误:比如用 relaxed 写标志位,又用 relaxed 读——无法保证看到最新值,必须配对 acquire/release 或用 seq_cst
  • 原子变量不能拷贝,只能移动或赋值:声明后不可 std::atomic a = b;,但支持 a.store(b.load())
  • 调试困难:无锁代码出错往往偶发且难以复现,建议先用 mutex 验证逻辑,再逐步替换为原子操作
  • 不是所有场景都适合无锁:高竞争下 CAS 可能频繁失败,反而比 mutex 更耗资源。简单同步优先用 std::mutexstd::shared_mutex

基本上就这些。掌握 atomic 的关键是理解「原子性」和「内存序」两个维度,动手写几个小例子(计数器、信号量、简单队列),比死记规则更有效。


# node  # 工具  #   # c++  # 无锁  # red  # String  # while  # 整型  # int  # void  # 循环  # 指针  # 数据结构  # Struct  # operator  # 线程  # 多线程  # pointer  # 适用于  # 不被  # 不可分割  # 到它  # 重试  # 是一个  # 信号量  # 几个  # 已被 


相关文章: 山东云建站价格为何差异显著?  如何通过西部建站助手安装IIS服务器?  如何在香港服务器上快速搭建免备案网站?  如何通过FTP空间快速搭建安全高效网站?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  制作销售网站教学视频,销售网站有哪些?  智能起名网站制作软件有哪些,制作logo的软件?  个人网站制作流程图片大全,个人网站如何注销?  潮流网站制作头像软件下载,适合母子的网名有哪些?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  深圳网站制作案例,网页的相关名词有哪些?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  宝塔建站助手安装配置与建站模板使用全流程解析  javascript中对象的定义、使用以及对象和原型链操作小结  如何自定义建站之星网站的导航菜单样式?  音乐网站服务器如何优化API响应速度?  如何在阿里云完成域名注册与建站?  如何通过VPS建站实现广告与增值服务盈利?  如何获取上海专业网站定制建站电话?  高防服务器如何保障网站安全无虞?  如何选择域名并搭建高效网站?  建站主机是否属于云主机类型?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  如何破解联通资金短缺导致的基站建设难题?  定制建站价位费用解析与套餐推荐全攻略  如何续费美橙建站之星域名及服务?  网站制作说明怎么写,简述网页设计的流程并说明原因?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何在Windows 2008云服务器安全搭建网站?  郑州企业网站制作公司,郑州招聘网站有哪些?  如何选择可靠的免备案建站服务器?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  制作企业网站建设方案,怎样建设一个公司网站?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  XML的“混合内容”是什么 怎么用DTD或XSD定义  建站之星2.7模板:企业网站建设与h5定制设计专题  如何快速搭建虚拟主机网站?新手必看指南  如何制作网站标识牌,动态网站如何制作(教程)?  如何用美橙互联一键搭建多站合一网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  表情包在线制作网站免费,表情包怎么弄?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何快速搭建自助建站会员专属系统?  制作网站公司那家好,网络公司是做什么的?  北京网站制作公司哪家好一点,北京租房网站有哪些?  常州自助建站工具推荐:低成本搭建与模板选择技巧 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。