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
相关产品推荐
相关产品推荐

