2013-10-16 82 views
1

是否可以通過代碼實現內存屏障(不使用CAS或其他鎖定原語,如易失性,原子類等)?
我相信破壞者能夠實現它,而不會實際發送任何鎖定原語。
任何指標或參考理解這將是有益的。
對其他編程模式的建議(最好在java中)也表示讚賞。通過編程實現的內存屏障

回答

1

內存屏障的概念與CAS和其他鎖定基元正交。例如,如果使用memory_order_relaxed指定,C++ 11允許CAS操作完全沒有任何內存屏障。一些硬件,特別是x68,總是將內存屏障與原子讀取 - 修改 - 寫入操作相關聯。

需要內存屏障但沒有CAS或鎖定的算法的最佳示例是Dekker協議。 「Location-Based Memory Fences」的第1部分對協議進行了很好的概述。

查看我的博客Volatile: Almost Useless for Multi-Threaded Programming爲什麼volatile是無用的內存屏障。

C++ - 特定信息:在C++ 11中,使用std::atomic_thread_fence。前面的鏈接有一個很好的使用它的例子,沒有鎖定。如果處理較舊的C++編譯器,則需要訴諸供應商特定的例程。一種方法是使用英特爾線程構建模塊的tbb :: atomic_fence()。這是圍繞我們可以找到的任何平臺特定圍欄的包裝。