Cppreference給following example約memory_order_relaxed
:重新排序和memory_order_relaxed
原子操作標記
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是測序-前內乙線程1和C是已排序 - 之前 D在線程2中,
- 沒有什麼能夠防止D出現在修改順序爲
y
的A之前,並且B在修改順序爲x
的C之前出現。
現在的問題是:如果A和B不能線程1內被重新排序,並且類似地,線程2內C和d(因爲每個那些是測序-之前其螺紋內),不是第1點和第2點相沖突?換句話說,不需要重新訂購(如第1點似乎需要的那樣),第2點中的情景如何可能,下面是可視化的?
T1 ........... T2
.............. d(y)的
A(Y)
B(x)的
.............. C(X)
因爲在這種情況下C將不是測序-之前 d線2內作爲一點1的要求。
我會建議在這裏看:http://stackoverflow.com/questions/6319146/c11-introduced-a-standardized-memory-model-what-does-it-mean-and-how-is-it- g,特別是關於與狹義相對論類比的答案。我對此的理解是,在輕鬆原子的情況下,沒有什麼是全球時間,因此您不能簡單地將某些全球時間圖中的動作可視化。特別是,每個線程可以在特定時間具有不同的內存視圖。 –