std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong
bool compare_exchange_weak ( value_type& expected, value_type desired, |
(1) | (C++26 起為 constexpr) |
bool compare_exchange_weak ( value_type& expected, value_type desired, |
(2) | (C++26 起為 constexpr) |
bool compare_exchange_strong ( value_type& expected, value_type desired, |
(3) | (C++26 起為 constexpr) |
bool compare_exchange_strong ( value_type& expected, value_type desired, |
(4) | (C++26 起為 constexpr) |
原子地將引用物件的值表示與 expected 的值表示進行比較,如果它們按位相等,則用 desired 替換前者(執行讀-修改-寫操作)。否則,將引用物件中儲存的實際值載入到 expected 中(執行載入操作)。
這些過載僅在 std::is_const_v<T> 為 false 時參與過載決議。
如果 failure 不是 std::memory_order_relaxed、std::memory_order_consume、std::memory_order_acquire 或 std::memory_order_seq_cst,則行為未定義。
目錄 |
[編輯] 引數
expected | - | 對預期在 atomic_ref 物件引用的物件中找到的值的引用 |
desired | - | 如果引用物件符合預期,則儲存到其中的值 |
成功 | - | 如果比較成功,則讀-改-寫操作的記憶體同步順序 |
failure | - | 如果比較失敗,則載入操作的記憶體同步順序 |
順序 | - | 兩個操作的記憶體同步順序 |
[編輯] 返回值
如果引用物件成功更改,則為 true,否則為 false。
[編輯] 注意
比較和複製是按位進行的(類似於 std::memcmp 和 std::memcpy);不使用建構函式、賦值運算子或比較運算子。
函式的弱形式 (1,2) 允許偽失敗,即即使它們相等,也表現得好像 *this != expected。當比較和交換在迴圈中時,弱版本在某些平臺上會產生更好的效能。
當弱比較和交換需要迴圈而強比較和交換不需要時,強比較和交換是首選,除非 `value_type` 的物件表示可能包含陷阱位,或者為相同的值提供多個物件表示(例如浮點 NaN)。在這些情況下,弱比較和交換通常有效,因為它會快速收斂到某個穩定的物件表示。
對於某些成員參與值表示而其他成員不參與的聯合體,比較和交換可能總是失敗,因為當填充位不參與活動成員的值表示時,它們具有不確定的值。
從不參與物件值表示的填充位會被忽略。
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3508 (P3323R1) |
C++20 | compare_exchange_weak 和 compare_exchange_strong 對 const T 來說沒有意義 |
限制為只接受非 const T |
[編輯] 示例
本節不完整 原因:無示例 |