函式
<atomic>

std::atomic_compare_exchange_weak

模板 (1)
template <class T>bool atomic_compare_exchange_weak (volatile atomic<T>* obj, T* expected, T val) noexcept;template <class T>bool atomic_compare_exchange_weak (atomic<T>* obj, T* expected, T val) noexcept;
過載 (2)
bool atomic_compare_exchange_weak (volatile A* obj, T* expected, T val) noexcept;bool atomic_compare_exchange_weak (A* obj, T* expected, T val) noexcept;
比較並交換包含的值(弱)
比較 obj 中包含的值與 expected 的值
- 如果為真,則將 val 替換為包含的值
- 如果為假,則將 expected 指向的值替換為包含的值

該函式始終訪問包含的值來讀取它,並在(如果比較為真)之後替換它。但整個操作是原子的:在讀取值的那一刻和替換它那一刻之間,該值不能被其他執行緒修改。

請注意,此函式直接比較包含的值的物理內容與 expected 的內容;這可能導致在 operator== 比較相等的數值上出現失敗的比較(如果底層型別具有填充位、陷阱值或相同值的替代表示),儘管這種比較在保留 expected 的迴圈中會快速收斂。

atomic_compare_exchange_strong 不同,此弱版本允許“虛假失敗”,即使 expected 中的值確實與 obj 中包含的值相等,也返回 false。對於某些迴圈演算法,此行為是可以接受的,並且可能在某些平臺上帶來顯著的效能提升。在這些“虛假失敗”的情況下,該函式返回 false,並且不修改 expected

對於非迴圈演算法,通常首選 atomic_compare_exchange_strong

有關 atomic 的等效成員函式,請參閱 atomic::compare_exchange_weak

引數

obj
指向 atomic 物件的指標。
型別 A 代表其他過載的 *原子型別* (如果庫不實現 *C 風格原子型別* 作為 atomic 的例項)。
expected
指向一個物件,其值將與包含的值進行比較,並且在不匹配的情況下可能被覆蓋包含的值
T 是原子物件中包含的值的型別(atomic 的模板引數)。
val
如果 expected包含的值匹配,則要複製到包含物件的值。
T 是原子物件中包含的值的型別(atomic 的模板引數)。

返回值

true 表示 *expected包含的值相等(並且未發生虛假失敗)。
否則返回 false

資料競爭

無資料競爭(原子操作)。該操作使用*順序一致性*(memory_order_seq_cst)。

異常安全

無異常保證: 絕不丟擲異常。

另見