Dekker式同步的失敗通常是通過重新排序指令來解釋的。即,如果我們寫爲什麼C++ 11的acquire_release範圍不夠用於Dekker同步?
atomic_int X;
atomic_int Y;
int r1, r2;
static void t1() {
X.store(1, std::memory_order_relaxed)
r1 = Y.load(std::memory_order_relaxed);
}
static void t2() {
Y.store(1, std::memory_order_relaxed)
r2 = X.load(std::memory_order_relaxed);
}
然後負載可以與商店進行重新排序,從而導致r1==r2==0
。
我在等一個acquire_release圍欄,以防止這種重新排序:
static void t1() {
X.store(1, std::memory_order_relaxed);
atomic_thread_fence(std::memory_order_acq_rel);
r1 = Y.load(std::memory_order_relaxed);
}
static void t2() {
Y.store(1, std::memory_order_relaxed);
atomic_thread_fence(std::memory_order_acq_rel);
r2 = X.load(std::memory_order_relaxed);
}
負載不能柵欄上方移動,商店不能移動柵欄下方,所以壞的結果應防止。
然而,實驗表明r1==r2==0
仍然會發生。有沒有基於重新排序的解釋?我的推理在哪裏存在缺陷?