You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

compare_exchange_weak原子性覆盖范围:加载*this到expected是否原子?

关于std::atomic::compare_exchange_weak中“原子地”的澄清

先明确cppreference中该函数的定义:

bool compare_exchange_weak( T& expected, T desired,
std::memory_order success,
std::memory_order failure ) noexcept;

原子地比较this与expected的对象表示(C20前)/值表示(C20起),若按位相等则将this替换为desired(执行读-改-写操作);否则将*this的实际值加载到expected中(执行加载操作)。

针对你的疑问,直接说明:

  • 这里的“原子地”指的是整个compare_exchange_weak的操作逻辑是不可分割的原子事务,而非对expected/desired的读写本身具备原子性。
  • 当底层原子值和expected不相等时,将*this的值加载到expected的操作,是整个原子事务的一部分——它和前面的“比较原子值与expected”步骤绑定在一起,不会被其他线程对该原子对象的任何原子操作打断。
  • 需要注意:expected是普通的T类型变量,你在函数外部对它的读写并不具备原子性,但compare_exchange_weak内部对它的写入,是和原子对象的操作作为一个整体被原子化的。

简单来说:其他线程永远看不到“已经完成原子值与expected的比较,但还没完成原子值替换或expected更新”的中间状态——整个函数的执行对其他线程而言,要么是“比较相等并替换了原子值”,要么是“比较不相等并把原子值写入了expected”,不存在第三种中间情况。

内容的提问来源于stack exchange,提问作者codesavesworld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:36:18