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

C++原子操作:生成值能否循环依赖自身计算及衍生场景探讨

C++原子操作中,生成的值是否允许循环依赖自身的计算?

根据C++原子操作内存模型的规范:

即使在宽松内存模型(relaxed memory model)下,也不允许凭空生成存在循环自依赖计算的值。比如当x和y初始值均为0时:

// Thread 1:
r1 = y.load(std::memory_order_relaxed);
if (r1 == 42)
    x.store(r1, std::memory_order_relaxed);
// Thread 2:
r2 = x.load(std::memory_order_relaxed);
if (r2 == 42)
    y.store(42, std::memory_order_relaxed);

这段代码不可能出现r1 == r2 && r2 == 42的结果——向y存储42的前提是x已被存入42,而x存入42又依赖于y先被存入42,形成了无法成立的循环依赖。

再看下面的代码场景:

// Initially:
y = 0;
x = 0;

// Thread1:
r1 = y.load(std::memory_order_relaxed);
if (r1 >= 0)
    x.store(1, std::memory_order_relaxed);

// Thread2:
r2 = x.load(std::memory_order_relaxed);
if (r2 > 0)
    y.store(2, std::memory_order_relaxed);

是否允许出现r1 == 2的结果?

结论是:这种结果既不被C++标准允许,实际硬件中也不可能发生。

要出现r1 == 2,需要满足的执行逻辑是:线程2先加载到x=1(意味着线程1已经执行了x.store(1)),然后线程2将y设为2,接着线程1加载到y=2,最后线程1执行x.store(1)。但线程1的x.store(1)是在它加载y的操作之后,而线程2的y.store(2)又依赖于线程1的x.store(1)完成,这形成了逻辑上的循环依赖,违反了C++内存模型中禁止循环自依赖值生成的规则。同时,实际硬件的内存执行顺序也无法实现这种逆序的依赖链,因此不可能出现该结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:41