首页 >后端开发 >C++ >C 原子读-修改-写操作是具有获取-释放语义的单个操作,还是加载和存储的序列?

C 原子读-修改-写操作是具有获取-释放语义的单个操作,还是加载和存储的序列?

Barbara Streisand
Barbara Streisand原创
2024-12-07 19:22:13304浏览

Are C   Atomic Read-Modify-Write Operations Single Operations with Acquire-Release Semantics, or a Sequence of Loads and Stores?

原子读-修改-写操作的内存排序

在 C 中,原子读-修改-写 (RMW) 操作,例如 x .exchange() 对其他加载和存储强制执行特定的排序保证。问题是是否考虑这些操作:

  1. 具有获取-释放语义的单个操作
  2. 获取加载后跟具有附加保证的释放存储

标准视角

按照C标准, RMW 操作被视为单一操作。这是由它们的单数名称和相关措辞暗示的。

ARM64 实现

在 ARM64 中,RMW 操作被实现为一系列加载、原子交换和存储指令。虽然理论上此实现允许存储指令在原子交换之前变得可见,但这不会影响标准的内存排序保证。

内存同步

C 中的内存同步主要基于释放和获取操作之间的同步关系。在提供的代码示例中:

  • x.exchange(1, std::memory_order_acq_rel):同步关系的获取并不重要,因为没有后续存储到 x。
  • x.load(std::memory_order_acquire):x上的负载不与任何东西同步,使其有效放松。

同步分析

由于没有其他操作可以同步,因此会发生以下顺序:

  1. 存储到 y
  2. 在 y 上加载(放松)
  3. 加载在 x 上(放松)

可能的输出

因此,代码确实可以输出 0, 1。标准的观点意味着 RMW 操作是单个操作,没有额外的保证,允许此输出。

以上是C 原子读-修改-写操作是具有获取-释放语义的单个操作,还是加载和存储的序列?的详细内容。更多信息请关注PHP中文网其他相关文章!

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