原子讀-修改-寫:單一操作還是兩個?
出於同步目的,原子讀-修改-寫 (RMW)像 x.exchange(..., std::memory_order_acq_rel) 這樣的操作引發了有關其處理的問題。它們被視為單一操作還是兩個單獨的操作?
標準的視角
C 標準將 RMW 操作視為單一實體。這從它們的命名和各種相關語言中隱含的內容中可以明顯看出。
同步含義
在您的示例中:
x.exchange(1, std::memory_order_acq_rel); // Line A y.store(1, std::memory_order_relaxed); // Line B
因此,代碼被簡化為:
x.store(1, std::memory_order_release); y.store(1, std::memory_order_relaxed);
因為這些之間沒有任何操作如果在另一個線程中存儲和相應的加載,同步將被有效禁用。這允許列印 0, 1。
ARM64 實作與意義
ARM64 的 x.exchange() 實作引起了關注。然而,經過仔細檢查,很明顯,該實施符合該標準對單一 RMW 操作的觀點。排序順序保證了 RMW 中最後讀取的值與寫入的一致。
cppreference 引用不正確
cppreference 所引用的文字不準確。 C 中的 RMW 操作被視為單一操作,禁止在其之前或之後重新排序其他操作。
以上是C 中的原子讀-修改-寫入是單一操作還是兩個操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!