原子读-修改-写:单个操作还是两个?
出于同步目的,原子读-修改-写 (RMW)像 x.exchange(..., std::memory_order_acq_rel) 这样的操作引发了有关其处理的问题。它们被视为单个操作还是两个单独的操作?
标准的视角
C 标准将 RMW 操作视为单一实体。这从它们的命名和各种相关语言中隐含的内容中可以明显看出。
同步含义
在您的示例中:
x.exchange(1, std::memory_order_acq_rel); // Line A y.store(1, std::memory_order_relaxed); // Line B
因此,代码被简化为:
x.store(1, std::memory_order_release); y.store(1, std::memory_order_relaxed);
因为这些之间没有任何操作如果在另一个线程中存储和相应的加载,同步将被有效禁用。这允许打印 0, 1。
ARM64 实现和含义
ARM64 的 x.exchange() 实现引起了关注。然而,经过仔细检查,很明显,该实施符合该标准对单一 RMW 操作的观点。排序顺序保证了 RMW 中最后读取的值与写入的一致。
cppreference 引用不正确
cppreference 引用的文本不准确。 C 中的 RMW 操作被视为单个操作,禁止在其之前或之后重新排序其他操作。
以上是C 中的原子读-修改-写是单个操作还是两个操作?的详细内容。更多信息请关注PHP中文网其他相关文章!