是否可以通過代碼實現內存屏障(不使用CAS或其他鎖定原語,如易失性,原子類等)?
我相信破壞者能夠實現它,而不會實際發送任何鎖定原語。
任何指標或參考理解這將是有益的。
對其他編程模式的建議(最好在java中)也表示讚賞。通過編程實現的內存屏障
1
A
回答
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()。這是圍繞我們可以找到的任何平臺特定圍欄的包裝。
相關問題
- 1. 共享內存中內部進程的屏障實現
- 2. 單線程內存屏障
- 3. 跨進程內存屏障
- 4. 內存屏障()
- 5. 垃圾收集器的內存屏障實現
- 6. 如何爲類x86系統實現C++ 11內存屏障?
- 7. 在Python2.7中實現屏障
- 8. 在swift3中實現屏障
- 9. 如何通過編程實現生根?
- 10. 如何通過C編程實現通過XMPP的ssh?
- 11. 鎖定語句的內存屏障
- 12. 內存屏障/柵欄的開銷
- 13. 實現自定義java屏障
- 14. 在Ruby中實現同步屏障
- 15. 如何通過片段實現全屏?
- 16. 全部內存屏障和ExclusiveReceiverGroup
- 17. WaitForSingleObject是否充當內存屏障?
- 18. 何時編譯器內存屏障(如std :: atomic_signal_fence)有用?
- 19. 如何實現沒有內存障礙的InterlockedIncrement
- 20. 通過Socket編程實現Javascript到Java通信
- 21. 通過現有代碼實現線程
- 22. Asciidoc標記是可編程擴展的(通過存在實現,如RST)?
- 23. 如何實現用Vue.js編寫的SPA的編程屏幕?
- 24. 加入線程時是否需要內存屏障?
- 25. 通過php遠程實現C++程序
- 26. 通過.NET Remoting實現內部接口
- 27. 通過AJAX實現CSS標籤內容
- 28. 如何通過編程方式清除緩存內存
- 29. GLSL 4.2圖像的加載和存儲與內存屏障
- 30. 內存故障