gpt4 book ai didi

c++ - 其他线程是否总是以相同的顺序看到不同线程中对同一位置的两次轻松写入?

转载 作者:IT老高 更新时间:2023-10-28 22:59:40 25 4
gpt4 key购买 nike

在 x86 架构上,存储到同一内存位置具有总顺序,例如,参见 this video . C++11内存模型有哪些保证?

更准确地说,在

-- Initially --
std::atomic<int> x{0};

-- Thread 1 --
x.store(1, std::memory_order_release);

-- Thread 2 --
x.store(2, std::memory_order_release);

-- Thread 3 --
int r1 = x.load(std::memory_order_acquire);
int r2 = x.load(std::memory_order_acquire);

-- Thread 4 --
int r3 = x.load(std::memory_order_acquire);
int r4 = x.load(std::memory_order_acquire);

是否允许结果 r1==1, r2==2, r3==2, r4==1 (在 x86 以外的某些架构上)?如果我用 std::memory_order_relaxed 替换所有 memory_order 会怎样?

最佳答案

不,这样的结果是不允许的。 §1.10 [intro.multithread]/p8, 18(引用 N3936/C++14;在 N3337/C++11 的第 6 和 16 段中可以找到相同的文本):

8 All modifications to a particular atomic object M occur in some particular total order, called the modification order of M.

18 If a value computation A of an atomic object M happens before a value computation B of M, and A takes its value from a side effect X on M, then the value computed by B shall either be the value stored by X or the value stored by a side effect Y on M, where Y follows X in the modification order of M. [ Note: This requirement is known as read-read coherence. —end note ]

在您的代码中有两个副作用,到 p8 时,它们会以特定的总顺序出现。在线程 3 中,计算要存储在 r1 中的值的值计算发生在 r2 之前,因此给定 r1 == 1r2 == 2 我们知道线程 1 执行的存储在 x 的修改顺序中先于线程 2 执行的存储。在这种情况下,Thread 4 无法观察 r3 == 2, r4 == 1 而不会与 p18 发生冲突。这与使用的 memory_order 无关。

p21(N3337 中的 p19)中有一条相关的注释:

[ Note: The four preceding coherence requirements effectively disallow compiler reordering of atomic operations to a single object, even if both operations are relaxed loads. This effectively makes the cache coherence guarantee provided by most hardware available to C++ atomic operations. —end note ]

关于c++ - 其他线程是否总是以相同的顺序看到不同线程中对同一位置的两次轻松写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27333311/

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