首页 >后端开发 >C++ >C 中的原子读-修改-写是单个操作还是两个操作?

C 中的原子读-修改-写是单个操作还是两个操作?

Patricia Arquette
Patricia Arquette原创
2024-12-05 02:13:09490浏览

Is Atomic Read-Modify-Write a Single Operation or Two in C  ?

原子读-修改-写:单个操作还是两个?

出于同步目的,原子读-修改-写 (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
  • 行B 没有匹配的版本或更强的存储,使其有效 y.store(1, std::memory_order_relaxed)。
  • A 行只有匹配的负载,使其“获取”部分变得多余。可以看成 x.store(1, std::memory_order_release)。

因此,代码被简化为:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn