首頁  >  文章  >  後端開發  >  為什麼 `std::atomic` 使用 `XCHG` 進行順序一致儲存?

為什麼 `std::atomic` 使用 `XCHG` 進行順序一致儲存?

Linda Hamilton
Linda Hamilton原創
2024-11-24 01:37:14987瀏覽

Why Does `std::atomic` Use `XCHG` for Sequentially Consistent Stores?

為什麼std::atomic 使用XCHG 進行順序一致性儲存

背景

在多執行緒領域,std::atomic 類別提供了意味著跨線程並發存取共享數據,同時確保數據完整性。它的 store 成員函數允許使用指定的記憶體排序語意將值寫入原子變數。

在順序一致性 (std::memory_order_seq_cst) 的情況下,x86 架構使用 xchg 指令來實作原子儲存。該指令執行同時交換值,而不是簡單的儲存操作。

XCHG 的動機

雖然可能看起來簡單的儲存指令與記憶體屏障結合(例如,_ReadWriteBarrier()或asm 易失性("" ::: "記憶體"); ) 足以保證順序一致性,使用xchg 有幾個優點:

1。完整記憶體屏障: xchg 由於其隱式鎖前綴,在 x86 上充當完整的記憶體屏障。這樣可以確保xchg之前和之後的所有記憶體操作都是有序的,有效防止記憶體重新排序。

2.發布語義不足: x86 上的正常儲存操作表現出發布語義,它允許對後續操作(包括獲取載入)進行重新排序。另一方面,順序一致性要求禁止此類重新排序。

效能注意事項

原子儲存的xchg 與mov mfence 之間的選擇具有效能影響:

  • Skylake: mfence指令的無序執行,而xchg 則不然。但是,xchg 對先前載入的值有錯誤依賴。
  • AMD:硬體最佳化手冊建議使用 xchg 進行順序一致性儲存。
  • GCC/ Clang 優化: 現代編譯器通常更喜歡xchg 而不是mov mfence.

線程柵欄的替代方案

除了使用xchg 進行原子儲存之外,實作原子線程柵欄的其他選項(也使用seq_cst記憶體排序)包括:

  • lock 加入堆疊
  • lock 或dword [rsp], 0

區分釋放與取得

區分釋放與取得要注意的是:
  • 具有順序一致性的儲存並不意味著取得語意。
  • asm volatile("" ::: "memory");僅是編譯器屏障,不強制執行順序一致。
  • 使用較弱順序操作和柵欄模擬順序一致性可能與 C 抽象機模型不完全一致。

結論

總而言之,x86 架構上具有順序一致性的std::atomic 存儲利用xchg,因為它具有完整的內存屏障效應以及與順序要求的兼容性一致性。儘管存在替代實現,但 xchg 因其效率和符合行業建議而仍然是廣泛採用的解決方案。

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

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