一個編譯圍欄的概念經常出現,當我讀到內存模型,障礙,訂貨,原子能等,但通常是在也上下文有CPU圍欄配對,如人們所期望的那樣。何時編譯器內存屏障(如std :: atomic_signal_fence)有用?
然而,偶爾我會看到圍欄結構只有適用於編譯器。這方面的一個例子是C++ 11 std::atomic_signal_fence
功能,其在cppreference.com規定:
的std :: atomic_signal_fence相當於標準:: atomic_thread_fence,除了沒有對CPU存儲器排序 指令被髮布。按照順序指示,僅編譯器重新排序 指令。
我有關於這個主題的五個問題:
正如顧名思義
std::atomic_signal_fence
,是一個異步中斷(如內核被搶佔一個線程來執行信號處理程序)只有其中編譯器只有柵欄是有用的情況下?它的用處適用於所有架構,包括強烈訂購例如
x86
?能否在具體例如提供展示一個編譯器只圍欄的用處?
使用
std::atomic_signal_fence
時,使用acq_rel
和seq_cst
排序是否有區別? (我希望它沒有什麼區別。)這個問題可能是由第一個問題所覆蓋,但我足夠的好奇,一下也無妨明確要求:它是有史以來必要用圍欄與
thread_local
訪問? (如果它曾經是,我希望只編譯圍欄如atomic_signal_fence
是首選的工具。)
謝謝。
你檢查了嗎? http://preshing.com/20120625/memory-ordering-at-compile-time。 –
引用preshing.com:「正如我所提到的,**編譯器的屏障足以防止單處理器系統上的內存重新排序**,但現在是2012年,而現在多核計算已成爲常態,如果我們要確保我們的[...]「 –
@chico:好的一點 - 如果程序員**知道**應用程序將會*在一個多處理器環境中按照期望的順序進行交互, * only **在非SMP系統上運行(即由於某種原因,單核CPU **或** SMP在內核中被禁用),這是編譯器不可能知道或假設的,然後是'atomic_signal_fence' (或其他*僅限編譯器* fence構造)可用作潛在的優化。正如文章所述,Linux內核具有以這種方式實現的函數「smp_rmb」和「smp_wmb」。但是,我仍然有興趣聽到答案 - 如果存在的話 - 不限於這種假設。 – etherice