首頁  >  文章  >  後端開發  >  為什麼 `std::atomic` 的儲存使用 XCHG 來實現 x86 上的順序一致性?

為什麼 `std::atomic` 的儲存使用 XCHG 來實現 x86 上的順序一致性?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-23 14:52:20684瀏覽

Why does `std::atomic`'s store use XCHG for sequential consistency on x86?

為什麼std::atomic 的儲存採用XCHG 來實現順序一致性

在x86 和x86_64 架構的std::atomic 上下文中std::atomic ,具有順序一致性的儲存操作(std::memory_order_seq_cst) 使用XCHG而不是使用內存屏障作為實現順序釋放語義的技術的簡單存儲。

順序一致性和xchg

順序一致性規定所有記憶體操作似乎都以某種方式執行連續順序,並且該順序對於所有執行緒都是相同的。 XCHG 是一種以原子方式交換兩個操作數的值的 x86 指令,本質上滿足了這種順序一致性要求。透過使用 XCHG 執行寫入操作,std::atomic 確保儲存在執行順序的特定點對所有執行緒全域可見,從而防止後續操作重新排序。

mov- store mfence 與XCHG

雖然簡單的mov-store 後跟內存柵欄(例如mfence)理論上可以提供釋放從語義上來說,它對於順序釋放儲存操作來說是不夠的。 MFENCE 是建立記憶體屏障的記憶體柵欄指令,可確保先前的寫入作業在繼續之前提交到記憶體。但是,它不會阻止後續載入操作在發布儲存體之前重新排序。

效能注意事項

順序發布的 mov-store mfence 和 XCHG 之間的選擇儲存作業涉及效能權衡。

  • 在某些 CPU 上(例如 Intel Skylake),XCHG 比 mov-store mfence 更有效率,特別是當周圍沒有需要與原子操作同步的依賴程式碼時。
  • 在其他 CPU 上,mov-store mfence 可能更適合高-吞吐量場景或周圍程式碼可以與原子操作重疊執行時。

實作詳細資訊

在實務中,std::atomic 具有順序一致性的儲存的具體實作因編譯器和硬體架構而異。

  • GCC/Clang: 最初使用mov-store mfence 但最近改用XCHG 進行seq-cst
  • Intel 編譯器:將XCHG 用於seq-cst 儲存。
  • Microsoft Visual C : 也將 XCHG 用於 seq-cst 儲存。

隱式取得柵欄

x86 儲存具有隱含取得柵欄的說法是不正確的。 x86 上的儲存具有釋放語義,而不是獲取語義。獲取語義通常使用記憶體屏障(例如 mfence)或帶有 std::memory_order_acquire 語義的原子讀取操作來強制執行。

以上是為什麼 `std::atomic` 的儲存使用 XCHG 來實現 x86 上的順序一致性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn