首页 > 后端开发 > C++ > 正文

c++原子操作atomic怎么用 c++无锁编程入门【教程】

裘德小鎮的故事
发布: 2025-12-23 12:32:42
原创
533人浏览过
std::atomic 是 C++ 无锁编程核心工具,提供原子读写、CAS 操作及内存序控制,需配合正确模式使用;支持基本类型,常用 load/store、fetch_add、compare_exchange_weak/strong 等操作,并注意 is_lock_free、内存序选择与避免忙等待等陷阱。

c++原子操作atomic怎么用 c++无锁编程入门【教程】

在 C++ 中,std::atomic 是实现无锁(lock-free)编程的核心工具,它保证对变量的读、写、修改等操作是原子的——即不会被线程调度打断,从而避免数据竞争。它不是“万能锁替代品”,而是需要配合正确的使用模式(如 compare-and-swap 循环、内存序控制)才能安全高效地工作。

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

最简单的场景是用 std::atomic 替代普通变量做计数或标志位:

  • 声明:支持基本类型(intboolpointer 等),例如 std::atomic<int> counter{0};</int>
  • 读写:用 .load().store(val),比直接赋值更明确语义;也可用 =++(但注意:++ 是读-改-写,有潜在开销)
  • 原子加减:counter.fetch_add(1) 返回旧值;counter += 1 返回新值
  • 布尔标志:std::atomic<bool> ready{false}; ready.store(true); if (ready.load()) { ... }</bool>

关键进阶:compare_exchange_weak / strong(CAS)

这是无锁结构(如、队列)的基石。它尝试“比较并交换”:仅当当前值等于预期值时,才把新值写入,并返回是否成功。

  • bool success = atom.compare_exchange_weak(expected, desired);
  • 必须用循环重试(因为 weak 版本可能伪失败):
    int expected = atom.load();
    while (!atom.compare_exchange_weak(expected, expected + 1)) { /* expected 自动更新为当前值 */ }
  • strong 版本不伪失败,但可能更慢;weak 更适合循环场景

内存序(memory order)不能忽略

原子操作默认使用 std::memory_order_seq_cst(最强顺序,性能略低)。实际中常需放宽以提升性能,但必须理解其含义:

星绘
星绘

豆包旗下 AI 写真、P 图、换装和视频生成

星绘 429
查看详情 星绘

立即学习C++免费学习笔记(深入)”;

  • memory_order_relaxed:只保证原子性,不约束前后内存访问顺序(适合计数器、引用计数)
  • memory_order_acquire:后续读写不能被重排到该操作之前(用于读标志位后读数据)
  • memory_order_release:前面读写不能被重排到该操作之后(用于写数据后设标志位)
  • acquire + release 配合可实现“同步点”,类似锁的进入/退出语义

注意事项与常见陷阱

无锁 ≠ 简单,用错反而更难调试:

  • std::atomic 不保证对象本身可 lock-free:可用 is_lock_free() 检查;小整型通常硬件支持,大结构可能退化为内部加锁
  • 不要对 atomic 取地址传给非原子函数(如 &atom 传给 printf
  • 避免在循环中频繁 load() 而不做 CAS —— 这是忙等待,应结合 std::this_thread::yield() 或条件变量
  • 无锁队列、栈等建议从成熟库起步(如 moodycamel::ConcurrentQueue),而非手写

以上就是c++++原子操作atomic怎么用 c++无锁编程入门【教程】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号