考慮下面的例子:例如關於內存排序在C++
-Thread 1-
y.store (20, memory_order_relaxed);
x.store (10, memory_order_release);
-Thread 2-
if (x.load(memory_order_acquire) == 10) {
assert (y.load(memory_order_relaxed) == 20)
y.store (10, memory_order_release)
}
-Thread 3-
if (y.load(memory_order_acquire) == 10)
assert (x.load(memory_order_relaxed) == 10)
在這個例子中第二assert
必火(對嗎?)。是否因爲在y.store (10, memory_order_release)
之前線程2中沒有存儲到x
?
(在cppreference.com中,他們說這個關於release
的句子:「使用此內存順序的存儲操作執行釋放操作:對其他內存位置的先前寫入對於在其上執行消耗或獲取的線程變得可見位置「。)
我可以在線程2中將y
的存儲順序從release
改爲sec/cst
以解決問題嗎?
沒有'assert'可以觸發..有趣的是,即使thread2中'y'的存儲順序改變爲'relaxed',仍然沒有'assert'可以觸發,因爲這不會破壞發生的鏈 - 之前事件(線程3仍然需要使用'acquire') – LWimsey