2013-03-07 27 views
15

我已經看到this question on acquire, release, consume, etc存在的,但是,沒有答案真的定義什麼是「消費操作」實際上是。什麼是C++ 11標準中的消費操作?

在1.10第5段它指出:

上的一個或多個存儲位置中的同步操作可以是一個消耗操作,獲取操作,釋放操作,或兩者的獲取和釋放操作。

我想知道是否有人可以解釋這是什麼,因爲它是在C++ 11標準的第1.10節中使用的?

+1

我認爲這是在「C++併發在行動」,由安東尼·威廉姆斯很好地解釋(但我忘了)。 – 2013-03-07 11:50:38

+1

@KerrekSB我認爲這可能是我獲得該書的時候了。 – 2013-03-07 11:50:57

+0

@TonyTheLion:是的,這本書解釋了它相當不錯 – 2013-03-07 11:51:27

回答

9

顯然,後一些周圍搜索中,「消耗的操作」,是在從存儲器讀出的值在負載後在幾個操作使用的存儲器的操作,並創建一個數據依賴性。

如果能夠訂購操作,而沒有引進外顯記憶柵欄,是明顯的(從我的理解)的目標是什麼memory_order_consume

memory_order_consume隨着,編譯器和CPU是需要訂購所討論的負載對只有那些隨後的加載和存儲爲地址或值從裝入的值被計算。 source

在本文稍後它說:

/*Example code elided */ 

關鍵的一點是,使用atomic_load_explicit()memory_order_consume保證後續的訪問將看到insert_foo()進行任何初始化,即使他們是併發執行,並且沒有明確的內存圍欄指令的開銷。相反,memory_order_acquire將在弱有序系統上需要顯式內存屏障,並會在所有系統上過度調節編譯器優化。

C++ 11標準草案n3485定義memory_order_consume爲:

29.3訂單和一致性[atomics.order]

memory_order_consume:在加載操作上受影響的執行消耗操作內存位置。

因此,從我的理解是訂購內存負載,以便後續負載和使用負載店確實隨後。換句話說,消耗的負載是