2013-05-29 69 views
3

我有C++ 11的std::memory_order類型的一個很好的概念理解(輕鬆 VS 獲取釋放 VS 順序一致 ...),但我想有一個更好的理解他們是如何通常爲x86(或x86_64)目標實現(通過編譯器)。如何爲類x86系統實現C++ 11內存屏障?

具體而言,低級別的細節(例如用於處理器之間的同步狀態或高速緩存存儲器的重要相關的CPU指令)爲每個順序約束(memory_order_consumememory_order_acquirememory_order_releasememory_order_seq_cst)的比較。

請提供儘可能多的底層細節,最好是x86_64或類似的架構。您的幫助將非常感謝。

回答

5

在x86和x86_64負載具有收購語義和商店有釋放的語義,無論如何,即使不使用原子能,所以除了seq_cst的全部內存的訂單要求無特殊說明的。

要獲得完整的順序一致性的編譯器可以插入一個mfence指令,以防止在截然不同的內存位置操作的重新排序,但我不認爲需要任何其它特殊要求。

編譯器需要避免在原子操作中移動加載和存儲,但這純粹是對編譯器優化器的限制,並且不需要發佈CPU指令。

請參閱http://www.stdthread.co.uk/forum/index.php?topic=72.0瞭解一些有用的信息。

2

香草薩特打破下來x86和其他架構在他原子<>武器包括PowerPC和ARM在C會談++和2012年以後,我認爲相關的幻燈片在second部分,但first部分也值得觀看。

+0

這也是非常有幫助的。 +1。 – etherice