2013-05-21 40 views
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]; 

Boost Example

這裏是我的理解(請糾正我,如果我錯了):

  1. 如果load操作由線程2先通過線程1store操作,那麼tmpdata[0]
  2. 如果線程1store操作操作先通過線程2load操作,那麼tmpdata[ 1 ]因爲store(1,memory_order_release)通過線程1將確保所有先前寫入到其他存儲位置是可見的線程2甚至儘管data[]在計算上不依賴於索引。

有人能澄清他們正在談論的錯誤嗎?

回答

1

隨着release/consume,寫入變量之前store(release) 只能保證在匹配load(consume)如果是可見的,且僅當, 變量是依賴於 store(release)使用的可變 - load(consume)對。

通過使用int文字來索引data[]這種依賴性已被打破,由此 寫入data[],不能保證在 a.load(consume)後是可見的。

+0

啊哈!好的。 我明白了。謝謝 – user2404835

+0

@ user2404835,沒問題。我會建議暫時不接受這個答案,看看是否有其他更豐富的答案到達。如果沒有,然後隨時接受它。 – hmjd

+0

好的。再次感謝你的幫助! – user2404835

相關問題