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

為什麼 `std::atomic` 使用 XCHG 來確保儲存中的順序一致性?

Patricia Arquette
Patricia Arquette原創
2024-11-24 01:39:09319瀏覽

Why Does `std::atomic` Use XCHG to Ensure Sequential Consistency in Stores?

XCHG 在確保std::atomic 儲存中的順序一致性方面的作用

雖然使用常規儲存然後進行讀取似乎很直覺/write 記憶體屏障以實現順序一致性,std::atomic 的儲存以順序一致性(seq_cst) 順序取代使用XCHG。這種方法透過 XCHG 在 x86 和 x86_64 架構中的具體特徵得到了證明。

原子RMW 和完整內存屏障

在x86 架構上,原子讀取-修改-寫入(RMW) 操作(例如XCHG)本質上充當完整內存屏障。 XCHG 上的隱含鎖定前綴強制執行全域順序,確保其執行的載入和儲存操作無法透過緩衝或載入重新排序來分開。

順序一致性與順序發布

x86 上的普通儲存操作具有釋放語義,這允許它們對後續操作(包括獲取載入)進行重新排序。為了強制執行順序一致性,需要順序釋放屏障,而不是單獨的釋放屏障。

效能注意事項

在 MFENCE 和 XCHG 之間進行選擇以實現 seq_cst 儲存涉及效能權衡。雖然 MFENCE 會阻止 Intel Skylake 及後續架構上的亂序執行,但 XCHG 不會。這種差異可能會影響周圍的程式碼執行。其他因素,例如快取狀態和執行緒爭用,也可能會影響效能。

編譯器和核心建議

最新版本的 GCC 和現代編譯器喜歡 XCHG 而不是 MFENCE seq_cst 在大多數平台上儲存。 Linux 核心使用 XCHG 進行原子 seq_cst 存儲,同時使用 XCHG 和 MFENCE 來實現不同類型的記憶體屏障。

x86 中的隱式記憶體屏障

該語句暗示x86 和 x86_64 儲存擁有隱式取得柵欄的說法是不正確的。這些架構上的儲存預設具有發布語意。為了取得語義,必須明確指定獲取操作。

結論

在std::atomic 的seq_cst 儲存中使用XCHG 可以保證x86 和x86_64 平台上的一致性順序透過利用RMW 操作固有的完整記憶體屏障屬性。其他選項,例如 MFENCE,可能會提供較弱的保證或不同的性能特徵,具體取決於特定的硬體和操作條件。

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

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