C++ atomic原子操作 C++ 无锁编程基础与内存序【并发编程】
发布时间 - 2026-01-31 00:00:00 点击率:次默认内存序为memory_order_seq_cst,最严格安全但性能开销大;乱改易致数据竞争,仅独立计数器可用relaxed;acquire/release须配对用于同步;weak版compare_exchange因伪失败更轻量,需循环使用;fence仅在混合原子与非原子变量时必要;volatile无同步语义,不可替代atomic。
atomic 的默认内存序为什么不能乱改
默认构造的 std::atomic 使用 memory_order_seq_cst,这是最严格也最安全的顺序。它保证所有线程看到的原子操作顺序一致,且与非原子内存访问形*序。但代价是可能触发全局内存屏障(如 x86 上的 mfence),在高竞争场景下显著拖慢性能。
常见误操作是把所有 load()/store() 都改成 memory_order_relaxed,结果出现读到“过期值”或逻辑错乱——比如一个线程写完标志位和数据,另一个线程却先读到标志位 true,再读到未初始化的数据。
- 仅当变量完全独立(如计数器、统计指标),且不参与同步逻辑时,才可用
memory_order_relaxed -
memory_order_acquire和memory_order_release必须配对使用:前者用于读标志位,后者用于写标志位,构成“发布-获取”同步关系 - x86 架构下
acquire/release几乎无额外开销,但 ARM/AArch64 必须插入dmb指令,不可忽略
compare_exchange_weak 为什么比 compare_exchange_strong 更常用
compare_exchange_weak 允许伪失败(spurious failure):即使当前值匹配,也可能返回 false。这在某些硬件(如 ARM、旧版 x86)上由 LL/SC(Load-Link/Store-Conditional)机制导致,属于正常行为,不是 bug。
它比 compare_exchange_strong 更轻量,尤其在循环重试场景中性能更好。几乎所有无锁数据结构(如 lock-free stack、queue)都用 weak 版本配合 do-while 循环。
- 必须在循环中使用:
do { ... } while (!a.compare_exchange_weak(expected, desired)); - 不要用
weak做一次性判断(比如“如果等于 X 就执行 Y”,不重试),否则可能跳过逻辑 -
strong版本适合单次尝试、且失败代价高(如需要回滚复杂状态)的场景,但极少遇到
atomic_thread_fence 什么时候真得用,而不是靠 atomic 操作自带的序
std::atomic_thread_fence 是独立于任何 atomic 变量的全局内存屏障,只约束当前线程的内存访问顺序。它不操作数据,只起“围栏”作用。绝大多数情况不需要它——atomic 带内存序参数已足够。
真正需要它的典型场景是:混合使用原子变量和普通变量,并需跨变量建立同步。例如,用一个 std::atomic 作为就绪标志,但实际数据存在普通 int 中:
// 线程 A
data = 42;
atomic_flag.store(true, std::memory_order_release);
// 线程 B
if (atomic_flag.load(std::memory_order_acquire)) {
// 此处 data 一定可见 —— 但前提是线程 A 的 data=42 不被重排到 store 之后
// 而 release/acquire 本身只约束 atomic_flag 的操作,不约束 data
// 所以线程 A 需要:
data = 42;
std::atomic_thread_fence(std::memory_order_release);
atomic_flag.store(true, std::memory_order_relaxed);
}
- 除非你在手动管理非原子变量的可见性,否则别碰
atomic_thread_fence -
memory_order_seq_cstfence 是最强的,但它会阻塞所有后续内存操作,慎用 - 编译器可能把普通变量访问优化掉或重排,fence 是告诉编译器“这里不能动”
std::atomic 和 volatile bool 的根本区别在哪
volatile 只禁用编译器优化(如缓存到寄存器),不提供任

std::atomic 则同时禁止编译器重排 + 生成必要硬件屏障 + 提供原子读写保证。
用 volatile bool 实现“停止标志”在单核或简单场景下看似有效,但在多核、开启 O2 优化、或遇到 StoreBuffer(如 x86 的 store forwarding)时大概率失效。
- 哪怕只是做
while(!flag) {}这种轮询,也必须用std::atomic,且 load 建议至少用memory_order_acquire -
volatile在 C++ 并发中基本没用,除了映射硬件寄存器等极少数场景 - 注意:
std::atomic不一定编译成锁,多数平台用单条指令(如 x86 的lock xchg或mov+ barrier)
# ai
# c++
# 并发编程
# 区别
# 无锁
# 为什么
# red
# 架构
# while
# bool
# int
# volatile
# 循环
# 数据结构
# Conditional
# 线程
# 并发
# bug
# 多核
# 读到
# 与非
# 重试
# 这是
# 不需要
# 什么时候
# 你在
# 但在
# 而在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何有效防御Web建站篡改攻击?
如何在腾讯云免费申请建站?
如何在阿里云通过域名搭建网站?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
如何彻底删除建站之星生成的Banner?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Swift中循环语句中的转移语句 break 和 continue
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
三星、SK海力士获美批准:可向中国出口芯片制造设备
JavaScript模板引擎Template.js使用详解
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
微信推文制作网站有哪些,怎么做微信推文,急?
如何在IIS中新建站点并解决端口绑定冲突?
深圳网站制作平台,深圳市做网站好的公司有哪些?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何基于云服务器快速搭建网站及云盘系统?
如何在Ubuntu系统下快速搭建WordPress个人网站?
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Windows Hello人脸识别突然无法使用
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何在建站宝盒中设置产品搜索功能?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何在阿里云高效完成企业建站全流程?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
千库网官网入口推荐 千库网设计创意平台入口
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel Docker环境搭建教程_Laravel Sail使用指南
Laravel安装步骤详细教程_Laravel环境搭建指南
香港服务器选型指南:免备案配置与高效建站方案解析
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
javascript日期怎么处理_如何格式化输出
如何在不使用负向后查找的情况下匹配特定条件前的换行符
Laravel如何使用Blade组件和插槽?(Component代码示例)
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel API资源类怎么用_Laravel API Resource数据转换
零服务器AI建站解决方案:快速部署与云端平台低成本实践
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
再谈Python中的字符串与字符编码(推荐)

