亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

轉到原子和內存順序

轉到原子和內存順序

Go
嚕嚕噠 2021-09-20 14:53:14
我正在從 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 并分析您的代碼,這只有您才能做到。


查看完整回答
反對 回復 2021-09-20
  • 1 回答
  • 0 關注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號