首頁 > 後端開發 > C++ > C 中的原子讀-修改-寫入是單一操作還是兩個操作?

C 中的原子讀-修改-寫入是單一操作還是兩個操作?

Patricia Arquette
發布: 2024-12-05 02:13:09
原創
486 人瀏覽過

Is Atomic Read-Modify-Write a Single Operation or Two in C  ?

原子讀-修改-寫:單一操作還是兩個?

出於同步目的,原子讀-修改-寫 (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
登入後複製
  • 行B 沒有匹配的版本或更強的存儲,使其有效y.store(1, std::memory_order_relaxed)。
  • A 行只有匹配的負載,使其「獲取」部分變得多餘。可以看成 x.store(1, std::memory_order_release)。

因此,代碼被簡化為:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板