名稱空間
變體
操作

std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong

來自 cppreference.com
< cpp‎ | atomic‎ | atomic ref
 
 
併發支援庫
執行緒
(C++11)
(C++20)
this_thread 名稱空間
(C++11)
(C++11)
(C++11)
協同取消
互斥
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
條件變數
(C++11)
訊號量
門閂和屏障
(C++20)
(C++20)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危險指標
原子型別
(C++11)
(C++20)
原子型別的初始化
(C++11)(C++20 中已棄用)
(C++11)(C++20 中已棄用)
記憶體排序
(C++11)(C++26 中已棄用)
原子操作的自由函式
原子標誌的自由函式
 
 
bool compare_exchange_weak

    ( value_type& expected, value_type desired,
      std::memory_order success,

      std::memory_order failure ) const noexcept;
(1) (C++26 起為 constexpr)
bool compare_exchange_weak

    ( value_type& expected, value_type desired,
      std::memory_order order =

          std::memory_order_seq_cst ) const noexcept;
(2) (C++26 起為 constexpr)
bool compare_exchange_strong

    ( value_type& expected, value_type desired,
      std::memory_order success,

      std::memory_order failure ) const noexcept;
(3) (C++26 起為 constexpr)
bool compare_exchange_strong

    ( value_type& expected, value_type desired,
      std::memory_order order =

          std::memory_order_seq_cst ) const noexcept;
(4) (C++26 起為 constexpr)

原子地將引用物件的值表示expected 的值表示進行比較,如果它們按位相等,則用 desired 替換前者(執行讀-修改-寫操作)。否則,將引用物件中儲存的實際值載入到 expected 中(執行載入操作)。

1,3) 讀-修改-寫和載入操作的記憶體模型分別為 successfailure
2,4) order 用於讀-修改-寫和載入操作,但如果 orderstd::memory_order_acq_relstd::memory_order_release,則載入操作使用 std::memory_order_acquirestd::memory_order_relaxed

這些過載僅在 std::is_const_v<T>false 時參與過載決議。

如果 failure 不是 std::memory_order_relaxedstd::memory_order_consumestd::memory_order_acquirestd::memory_order_seq_cst,則行為未定義。

目錄

[編輯] 引數

expected - 對預期在 atomic_ref 物件引用的物件中找到的值的引用
desired - 如果引用物件符合預期,則儲存到其中的值
成功 - 如果比較成功,則讀-改-寫操作的記憶體同步順序
failure - 如果比較失敗,則載入操作的記憶體同步順序
順序 - 兩個操作的記憶體同步順序

[編輯] 返回值

如果引用物件成功更改,則為 true,否則為 false

[編輯] 注意

比較和複製是按位進行的(類似於 std::memcmpstd::memcpy);不使用建構函式、賦值運算子或比較運算子。

函式的弱形式 (1,2) 允許偽失敗,即即使它們相等,也表現得好像 *this != expected。當比較和交換在迴圈中時,弱版本在某些平臺上會產生更好的效能。

當弱比較和交換需要迴圈而強比較和交換不需要時,強比較和交換是首選,除非 `value_type` 的物件表示可能包含陷阱位,或者為相同的值提供多個物件表示(例如浮點 NaN)。在這些情況下,弱比較和交換通常有效,因為它會快速收斂到某個穩定的物件表示。

對於某些成員參與值表示而其他成員不參與的聯合體,比較和交換可能總是失敗,因為當填充位不參與活動成員的值表示時,它們具有不確定的值。

從不參與物件值表示的填充位會被忽略。

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3508
(P3323R1)
C++20 compare_exchange_weakcompare_exchange_strong
const T 來說沒有意義
限制為只接受非 const T

[編輯] 示例