std::experimental::atomic_weak_ptr<T>::compare_exchange_strong, std::experimental::atomic_weak_ptr<T>::compare_exchange_weak
bool compare_exchange_weak( std::weak_ptr<T>& expected, const std::weak_ptr<T>& desired, std::memory_order success, std::memory_order failure ) noexcept; |
(1) | |
bool compare_exchange_weak( std::weak_ptr<T>& expected, std::weak_ptr<T>&& desired, std::memory_order success, std::memory_order failure ) noexcept; |
(2) | |
bool compare_exchange_weak( std::weak_ptr<T>& expected, const std::weak_ptr<T>& desired, std::memory_order order = std::memory_order_seq_cst ) noexcept; |
(3) | |
bool compare_exchange_weak( std::weak_ptr<T>& expected, std::weak_ptr<T>&& desired, std::memory_order order = std::memory_order_seq_cst ) noexcept; |
(4) | |
bool compare_exchange_strong( std::weak_ptr<T>& expected, const std::weak_ptr<T>& desired, std::memory_order success, std::memory_order failure ) noexcept; |
(5) | |
bool compare_exchange_strong( std::weak_ptr<T>& expected, std::weak_ptr<T>&& desired, std::memory_order success, std::memory_order failure ) noexcept; |
(6) | |
bool compare_exchange_strong( std::weak_ptr<T>& expected, const std::weak_ptr<T>& desired, std::memory_order order = std::memory_order_seq_cst ) noexcept; |
(7) | |
bool compare_exchange_strong( std::weak_ptr<T>& expected, std::weak_ptr<T>&& desired, std::memory_order order = std::memory_order_seq_cst ) noexcept; |
(8) | |
原子地比較 *this 中底層的 weak_ptr
與 expected,如果它們等價,則用 desired 替換前者(執行讀-改-寫操作)。否則,將 *this 中儲存的實際值載入到 expected 中(執行載入操作)。替換操作透過 weak_ptr
的複製或移動賦值運算子(視情況而定)執行。
當且僅當兩個 weak_ptr
儲存相同的指標值並共享所有權時,它們才等價。
讀-改-寫和載入操作的記憶體模型分別是 success 和 failure。對於過載 (3,4,7,8),order 用於讀-改-寫和載入操作,但如果 order == std::memory_order_acq_rel,則載入操作使用 std::memory_order_acquire;如果 order == std::memory_order_release,則載入操作使用 std::memory_order_relaxed。
弱版本 (1-4) 可能會虛假失敗。
目錄 |
[編輯] 引數
expected | - | 對原子物件中預期值的引用 |
desired | - | 如果原子物件符合預期,則儲存到原子物件中的值 |
成功 | - | 如果比較成功,讀-改-寫操作的記憶體同步順序。允許所有值 |
failure | - | 如果比較失敗,載入操作的記憶體同步順序。不能是 std::memory_order_release 或 std::memory_order_acq_rel,也不能指定比 success 更強的順序 |
順序 | - | 兩個操作的記憶體同步順序 |
[編輯] 返回值
如果底層原子值已更改,則為 true,否則為 false。
[編輯] 備註
對 atomic_weak_ptr
物件本身的所有更改以及所有相關的 use_count 增量都保證原子執行。相關的 use_count
減量在原子操作之後發生,但不需要作為其一部分。任何相關的銷燬或解分配操作在原子操作之後發生,並且不作為其一部分。
如果比較-交換操作返回 true,則在原子更新步驟之後不會訪問 expected。如果返回 false,則 expected 會更新為從嘗試的原子更新中的 atomic_weak_ptr
物件讀取的現有值。expected 的寫入對應的 use_count
更新是原子操作的一部分,但 expected 的寫入本身不要求是原子操作的一部分。
對於過載 (1,3,5,7),在原子更新步驟之後不訪問 desired。
對於過載 (2,4,6,8),只有當比較-交換操作返回 true 時,才會從 desired 移動;移動發生在原子更新步驟之後。
[編輯] 注意
函式的弱形式 (1-4) 允許虛假失敗,即即使 *this 和 expected 等價,也表現為不等價。當比較和交換在迴圈中時,弱版本在某些平臺上會產生更好的效能。
[編輯] 另請參閱
特化 std::shared_ptr 的原子操作(函式模板) |