為什麼std::atomic 的儲存採用XCHG 來實現順序一致性
在x86 和x86_64 架構的std::atomic 上下文中,a具有順序一致性的儲存操作(std::memory_order_seq_cst) 使用XCHG而不是具有內存屏障的簡單存儲作為實現順序釋放語義的技術。
順序一致性和 xchg
順序一致性規定所有記憶體操作似乎都按某種順序執行,並且該順序對於所有執行緒都是相同的。 XCHG 是一種以原子方式交換兩個操作數的值的 x86 指令,本質上滿足了這種順序一致性要求。透過使用 XCHG 執行寫入操作,std::atomic 確保儲存在執行順序的特定點對所有執行緒全域可見,從而防止後續操作重新排序。
mov- store mfence 與XCHG
雖然簡單的mov-store 後跟內存柵欄(例如mfence)理論上可以提供釋放語義,但對於順序釋放存儲操作來說還不夠。 MFENCE 是建立記憶體屏障的記憶體柵欄指令,可確保先前的寫入作業在繼續之前提交到記憶體。但是,它不會阻止後續載入操作在發布儲存體之前重新排序。
效能注意事項
順序發布的 mov-store mfence 和 XCHG 之間的選擇儲存作業涉及效能權衡。
實作細節
實際中,std::atomic的順序一致性儲存的具體實作根據編譯器和硬體架構的不同而有所不同。
隱式獲取柵欄
x86 的聲明商店有一個隱式的獲取柵欄是不正確的。 x86 上的儲存具有釋放語義,而不是獲取語義。獲取語義通常使用記憶體屏障(例如 mfence)或帶有 std::memory_order_acquire 語義的原子讀取操作來強制執行。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3