gpt4 book ai didi

c - C11原子与序列点的关系

转载 作者:行者123 更新时间:2023-12-04 13:24:46 26 4
gpt4 key购买 nike

我基本上有以下代码片段:

size_t counter = atomic_fetch_sub_explicit(&atomicCounter, 1, memory_order_release);
if (counter - 1 == 0
&& atomic_load_explicit(&anotherAtomicCounter, 1, memory_order_relaxed) == 0 {
//Some code
}
为了正确,重要的是 anotherAtomicCounter 的原子负载发生在 atomicCounter 的 fetch-and-sub (FAS) 之后.对于给定的内存顺序,这通常无法保证,并且加载可能在 FAS 之前发生。但是,我想知道序列点如何影响这个特定的代码。该标准提到

If evaluation A is sequenced before evaluation B, then evaluation of A will be complete before evaluation of B begins.


结合规则编号 2

There is a sequence point after evaluation of the first (left) operand and before evaluation of the second (right) operand of the following binary operators: && (logical AND), || (logical OR), and , (comma).


这意味着原子负载必须在比较之后发生,但只有在知道 FAS 的结果后才能完成比较。
我的问题是这些规则是否保证原子加载总是发生在 FAS 之后,即使使用更宽松的内存顺序?
提前致谢!

最佳答案

要回答标题中的问题,原子和序列点之间没有真正的关系。
所写的代码确实保证编译器必须执行 atomic_fetch_sub之前atomic_load .但是这些函数(在 C 的内存模型中)只是请求平台对某些内存块执行某些操作。当它们对谁可见时,它们的效果由内存模型和排序参数指定。因此,即使在您知道请求 A 出现在请求 B 之前的情况下,这并不意味着请求 A 的影响在请求 B 之前解决,除非您明确指定它。

关于c - C11原子与序列点的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69205096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com