我打算在升壓原子的文檔和我碰到下面的例子就是:需要幫助理解Boost.Atomic內存模型`memory_order_release`例
atomic<int> a(0);
thread1:
... /* A */
a.fetch_add(1, memory_order_release);
thread2:
int tmp = a.load(memory_order_acquire);
if (tmp == 1)
{
... /* B */
}
else
{
... /* C */
}
現在我還是有點糊塗關於memory_order_release和memory_order_acquire。該文檔描述了他們爲:
memory_order_release
執行釋放操作。非正式的說,防止所有在前的 內存操作重新排序過去這一點。
memory_order_acquire
執行獲取操作。非正式的說,在這之前阻止成功的內存操作被重新排序。
即使有了這些例子,我仍然有點困惑。如果有人能夠解釋上述定義的含義以及A和C如何發生衝突,我將不勝感激。
感謝您的答覆。這解釋了很多。還有一個問題,在你的帖子開頭你說過:「這些定義意味着在存儲之後,A中的所有內存操作都不能重新排序。你能解釋一下在這裏重新排序意味着什麼「非內存操作可以重新排序」是什麼意思? – MistyD
@MistyD:如果A的最後一行包含對變量'b'的更新,'memory_order_release'確保編譯器和CPU都不會在更新到'a'之後將寫入重新排序到'b'。沒有這個保證,如果B訪問'b',可能會出現競爭條件 –