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

C++原子操作示例:#1与#4同时为真是否依赖无中生有值?

原子操作中的“无中生有值”判定问题

给定如下示例:x初始值为0,y初始值为2。

std::atomic<int> x = 0, y = 2;
// thread 1:
if(y.load(relaxed) == 1){ // #1
   x.store(1,relaxed); // #2
}
//thread 2:
int pre = x.load(relaxed); // #3
while(pre != 0){
   if(x.compare_exchange_strong(pre, pre+1, acquire, relaxed)){  // #4
       break;
   }
}
y.store(1,relaxed); // #5

核心问题

若#1与#4均返回true,该结果是否依赖无中生有值(out-of-thin-air value)?

标准依据

[atomics.order] p8规定:实现应确保不存在循环依赖自身计算的“无中生有”值。

初始示例分析

  • #1返回true的前提是读取到#5写入的1,而无论pre的值是0还是非0,#5都会执行。
  • #4返回true的必要条件是pre != 0,但x初始值为0,因此pre只能是读取到#2写入的1——也就是说#3和#4必须都读取#2的结果。

基于上述分析,可将原示例简化为如下形式:

// thread 1:
if(y.load(relaxed) == 1){ // #1
   x.store(1,relaxed); // #2
}
// thread 2:
int pre = 1;
while(!x.compare_exchange_strong(pre,pre+1, acquire, relaxed)){} // #4
y.store(1,relaxed); // #5

简化后的问题

此时依赖链为:#1依赖#5的写入结果,#5的执行依赖#4读取到#2的写入结果,#2的执行又依赖#1返回true。若#1与#4均返回true,该结果是否属于无中生有值(OOTA)?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:23:10