2
我在看一個關於原子操作和事件之前關係的Boost示例,我有點困惑。 在「之前發生過釋放和消費」部分,有如下的例子,他們說這是錯誤的,但我不能看到它:Boost memory_order_consume示例
atomic<int> a(0);
complex_data_structure data[2];
線程1:
data[1] = ...; /* A */
a.store(1, memory_order_release);
線程2:
int index = a.load(memory_order_consume);
complex_data_structure tmp;
if (index == 0)
tmp = data[0];
else
tmp = data[1];
這裏是我的理解(請糾正我,如果我錯了):
- 如果
load
操作由線程2先通過線程1的store
操作,那麼tmp
會data[0]
。 - 如果線程1的
store
操作操作先通過線程2的load
操作,那麼tmp
將data[ 1 ]
因爲store(1,memory_order_release)
通過線程1將確保所有先前寫入到其他存儲位置是可見的線程2甚至儘管data[]
在計算上不依賴於索引。
有人能澄清他們正在談論的錯誤嗎?
啊哈!好的。 我明白了。謝謝 – user2404835
@ user2404835,沒問題。我會建議暫時不接受這個答案,看看是否有其他更豐富的答案到達。如果沒有,然後隨時接受它。 – hmjd
好的。再次感謝你的幫助! – user2404835