首页 >后端开发 >C++ >原子读取-修改-写入是单个操作还是获取-释放操作的序列?

原子读取-修改-写入是单个操作还是获取-释放操作的序列?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-01 14:06:13807浏览

Is an Atomic Read-Modify-Write a Singular Operation or a Sequence of Acquire-Release Operations?

区分原子读-修改-写中的单个操作和单独操作

在内存排序的上下文中,原子读-修改-写(RMW)的行为操作,例如 x.exchange(...) 与 std::memory_order_acq_rel,提出了一个问题:此操作是否被视为单个实体具有获取-释放语义,还是作为包含获取加载和释放存储的一系列操作?

标准视角:奇异操作

根据 C 标准, RMW 操作被视为单一操作。这种含义源自其使用单数形式的名称以及标准的相关措辞。因此,在这种情况下,x.exchange(...) 操作被视为单个实体。

排序含义:潜在的重新排序

如果我们考虑从标准的角度来看,所提供的代码有可能输出 0, 1。出现这种可能性是因为该标准不是根据操作重新排序来定义的,而是根据释放和获取操作之间的同步关系。

具体来说,y.load(acquire) 操作没有匹配的释放或更强的存储。因此,它不与任何其他操作同步,并被有效地视为松弛负载 (y.load(relaxed))。

此外,x.exchange(1, acq_rel) 操作的“获取”组件确实没有任何存储可以同步,使其获取语义有效地放松。这有效地将其转换为 x.store(1, release) 操作。

由于在各个线程中存储之前和加载 x 之后没有任何操作,因此这些操作之间的潜在同步变得多余。因此,两个加载都可以返回 0 或 1,从而允许输出 0、1。

结论

从 C 标准的角度来看,原子读取修改-写入操作被视为单个操作。这种理解意味着,在提供的示例中,由于加载和存储之间缺乏同步,代码有可能打印 0, 1。

以上是原子读取-修改-写入是单个操作还是获取-释放操作的序列?的详细内容。更多信息请关注PHP中文网其他相关文章!

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