我正在從 c++11 移植一個無鎖隊列,我遇到了諸如auto currentRead = writeIndex.load(std::memory_order_relaxed);在某些情況下std::memory_order_release,并std::memory_order_aqcuire 也為C11以上的equivelent是一樣的東西unsigned long currentRead = atomic_load_explicit(&q->writeIndex,memory_order_relaxed);此處描述了這些的含義在 go 中是否有類似的東西,或者我只是使用類似的東西var currentRead uint64 = atomic.LoadUint64(&q.writeIndex)移植后我進行了基準測試并僅使用 LoadUint64 它似乎按預期工作,但速度慢了幾個數量級,我想知道這些專門的操作對性能有多大影響。我附加的鏈接中的更多信息memory_order_relaxed :Relaxed 操作:沒有同步或排序約束,這個操作只需要原子性。memory_order_consume:具有此內存順序的加載操作對受影響的內存位置執行消耗操作:在此加載之前,可以重新排序依賴于當前加載的值的當前線程中的任何讀取。這確保了對釋放相同原子變量的其他線程中的數據相關變量的寫入在當前線程中可見。在大多數平臺上,這僅影響編譯器優化。memory_order_acquire:具有此內存順序的加載操作對受影響的內存位置執行獲取操作:在此加載之前,當前線程中的內存訪問不能重新排序。這確保了釋放相同原子變量的其他線程中的所有寫入在當前線程中都是可見的。memory_order_release:具有此內存順序的存儲操作執行釋放操作:在此存儲之后,當前線程中的任何內存訪問都不能重新排序。這確保了當前線程中的所有寫入在獲取相同原子變量的其他線程中都是可見的,并且攜帶對原子變量的依賴的寫入在消耗相同原子的其他線程中變得可見。
1 回答

喵喔喔
TA貢獻1735條經驗 獲得超5個贊
你需要閱讀Go Memory Model
您會發現 Go 與您在 C++ 中擁有的控件完全不同——您的帖子中沒有直接翻譯 C++ 功能。這是 Go 作者的一個深思熟慮的設計決定——Go 的座右銘是不要通過共享內存進行通信;相反,通過通信共享內存。
假設標準 go 通道不足以滿足您的需求,您將有 2 個選擇用于每次內存訪問,使用同步/原子設施,以及您是否需要使用它們將取決于仔細閱讀 Go Memory Model 并分析您的代碼,這只有您才能做到。
- 1 回答
- 0 關注
- 222 瀏覽
添加回答
舉報
0/150
提交
取消