gpt4 book ai didi

c++ - 排序前修改顺序一致性

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:56 29 4
gpt4 key购买 nike

来自 http://en.cppreference.com :

宽松排序标记为 std::memory_order_relaxed 的原子操作不是同步操作,它们不排序内存。它们只保证原子性和修改顺序的一致性。例如,x 和 y 最初为零,

// Thread 1:
r1 = y.load(memory_order_relaxed); // A
x.store(r1, memory_order_relaxed); // B
// Thread 2:
r2 = x.load(memory_order_relaxed); // C
y.store(42, memory_order_relaxed); // D

被允许产生 r1 == r2 == 42 因为,虽然 A 排在 B 之前,C 排在 D 之前,但没有什么能阻止 D 按 y 的修改顺序出现在 A 之前,以及 B 出现在 C 之前按照x的修改顺序。

问题:是什么赋予上面的代码属性A sequenced-before BC sequenced before D?

编辑:

int A, B;

void foo()
{
A = B + 1; (A)
B = 0; (B)
}

导致

$ gcc -O2 -S -masm=intel foo.c
$ cat foo.s
...
mov eax, DWORD PTR B
mov DWORD PTR B, 0
add eax, 1
mov DWORD PTR A, eax
...

在带有 -02 选项的 GCC 4.6.1 下

所以我们清楚地看到(A)和(B)已经交换了

最佳答案

sequenced-before(与happens-before 不同)关系并不特定于多线程。它们也发生在单线程程序中。任何以分号结尾的表达式都是 sequenced-before 下一个,所以在这种情况下 ABC< 之前排序D 之前,因为它们中的每一个都是完整表达式。

来自标准 1.9 程序执行 14:

Every value computation and side effect associated with a full-expression is sequenced before every value computation and side effect associated with the next full-expression to be evaluated.

你可以在这里找到解释:

Order of evaluation

关于c++ - 排序前修改顺序一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462915/

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