原子讀-修改-寫是原子操作還是可分離操作?
原子讀-修改-寫(RMW)操作,例如x.exchange() 是讀取和寫入記憶體位置並確保讀取和寫入操作按順序執行的原子操作。但是,沒有明確定義這些操作是被視為單一原子操作還是取得載入和釋放儲存的組合。
標準的視角
來自從 C 標準的角度來看,RMW 操作被視為單一操作。從以下事實可以明顯看出這一點:它具有單一名稱 (RMW),並且被標準稱為單一操作。例如,[N4860](https://isocpp.org/files/papers/n4860.pdf)(工作論文草稿std::memory_order)指出:
「使用此指令進行讀取-修改-寫入操作記憶體順序既是獲取操作又是釋放操作,在此之前或之後當前線程中的記憶體讀取或寫入都不能重新排序。
原子操作與可分離操作
原子操作和可分離操作之間的區別很重要,因為它決定了其他操作如何與它們互動。操作被視為原子操作,則意味著它不能相對於其他記憶體存取進行重新排序。 🎜>
範例程式碼考慮以下程式碼範例,它使用x.exchange() 和y.store() 設定兩個原子變數 x和y.
如果x.exchange() 被視為單一原子操作,則表示該操作的載入和儲存元件無法重新排序。的值都是1 或都是0。被視為可分離的,則存在載入和儲存的可能性操作的元件可以重新排序。會在儲存到y 之前重新排序。似乎不應該觀察到 0, 1。這種明顯的差異引發了一個問題:cppreference 引用是否不正確,或者只是對標準的誤解。雖然 cppreference 引用可能不完全準確,但它符合標準將 RMW 操作視為單一原子操作的一般處理方式。
需要注意的是,該標準沒有明確定義 RMW 操作在所有情況下。特別是,它沒有提供關於同步關係如何應用於 RMW 操作的明確指導。因此,RMW 操作可能存在不同的解釋和實現空間。
以上是原子讀-修改-寫入是單一原子操作還是可分離的操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!