記憶體排序中原子讀-修改-寫入(RMW)操作的處理
回答有關原子讀性質的問題-修改-寫入(RMW)操作,C標準將它們分類為具有組合獲取和釋放語義的單一操作
排序的含義
此指定意味著在RMW 操作之前或之後,同一執行緒中發生的記憶體讀取或寫入不能重新排序。但是,它並不排除 RMW 的內部讀寫元件之間重新排序的可能性。
具體範例
考慮提供的程式碼範例:
std::atomic<int> x, y; void thread_A() { x.exchange(1, std::memory_order_acq_rel); y.store(1, std::memory_order_relaxed); } void thread_B() { int yy = y.load(std::memory_order_acquire); int xx = x.load(std::memory_order_acquire); std::cout << xx << ", " << yy << std::endl; }
在這種情況下,執行緒 B 確實可以輸出 0, 1。這是因為在線程 A 的 RMW 操作可以在內部重新排序,從而允許線程 B 觀察載入 (0) 之後但儲存 (1) 之前的狀態。
ARM64 實作
RMW 操作的 ARM64 實作(如 ldaxr、stlxr 和 str 指令所述)符合標準的期望。 str 指令可以在 stlxr 指令之前可見,可能會導致執行緒 B 觀察到 0、1。
記憶體順序影響
將memory_order_acq_rel 替換為seq_cst 將不影響此行為,因為它僅引入相對於其他seq_cst 操作的附加語意範例,這些語意是程式碼範例中不存在。
結論
C 中的原子 RMW 操作是具有獲取-釋放語義的單一操作。雖然它們防止外部操作前後重新排序,但其內部元件之間重新排序的可能性允許出現類似程式碼範例中的場景,其中執行緒 B 可以輸出 0、1。
以上是C 原子讀-修改-寫入操作中的內部重新排序如何影響記憶體排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!