-Thread 1-
y.store (20, memory_order_release);
x.store (10, memory_order_release);
-Thread 2-
if (x.load(memory_order_acquire) == 10) {
assert (y.load(memory_order_acquire) == 20);
y.store (10, memory_order_release)
}
-Thread 3-
if (y.load(memory_order_acquire) == 10) {
assert (x.load(memory_order_acquire) == 10);
}
GCC Atomic Wiki段落“Overall Summary”说,上面的代码assert(x.load(memory_order_acquire))
可能会失败。但我不明白为什么?
我的理解是:</p>
- 由于获取障碍, Thread3无法LoadLoad 重新排序。
- 由于释放障碍,Thread1无法StoreStore重新排序。
- 当 Thread2 read(x)->10 时,x 必须从 storebuffer 刷新到 Thread1 中的缓存,所以每个线程都知道 x 的值发生了变化,例如使缓存行无效。
- Thread3 使用Acquire屏障,因此它可以看到 x(10)。