首頁 >後端開發 >C++ >x86 載入和儲存是原子的嗎?

x86 載入和儲存是原子的嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-28 10:55:12335瀏覽

Are x86 Loads and Stores Atomic?

x86 上載入和儲存的原子性

儘管std::atomic 中的記憶體操作僅依賴總線鎖定,但原子操作的印象實際上是在快取中執行的。

快取一致性

快取一致性可確保所有核心具有一致的記憶體視圖。快取行以原子塊的形式在核心和記憶體之間傳輸。這允許原子操作在快取內發生,而不依賴外部匯流排鎖定。

對齊操作

保證最多 64 位元的對齊載入和儲存操作x86 處理器上的原子。這是因為對齊的存取可以透過足夠寬以容納整個操作的資料路徑進行傳輸。

未對齊的操作

未對齊的載入和儲存可以成為非原子的,因為它們可能需要多次存取才能完成。例如,跨越快取行邊界的載入或儲存必須在兩個單獨的存取中執行,使其成為非原子的。

原子讀-修改-寫入操作

原子讀-修改-寫入操作,例如lock add [mem]、eax,實現起來比簡單的加載或存儲更複雜。這些操作要求核心將受影響的快取行保持在修改狀態,並防止任何外部修改,直到操作完成。未對齊的讀取-修改-寫入操作可能需要斷言 LOCK# 訊號來鎖定總線並防止其他核心存取受影響的記憶體。

編譯器最佳化

編譯器可能透過省略 mfence 指令來最佳化 seq_cst 加載,因為 x86 記憶體排序會阻止 LoadLoad 和 LoadStore 重新排序。然而,seq_cst 儲存仍然需要柵欄來防止 StoreLoad 重新排序。

總而言之,x86 處理器上的原子性是透過快取一致性、對齊操作和未對齊讀取-修改-寫入操作的匯流排鎖定的組合來實現的。這使得原子操作能夠有效率地進行,並且不會影響整體系統性能。

以上是x86 載入和儲存是原子的嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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