名稱空間
變體
操作

std::experimental::atomic_shared_ptr<T>::compare_exchange_strong, std::experimental::atomic_shared_ptr<T>::compare_exchange_weak

來自 cppreference.com
 
 
實驗性
技術規範
檔案系統庫 (檔案系統 TS)
庫基礎 (庫基礎 TS)
庫基礎 2 (庫基礎 TS v2)
庫基礎 3 (庫基礎 TS v3)
並行性擴充套件 (並行性 TS)
並行性擴充套件 2 (並行性 TS v2)
併發性擴充套件 (併發性 TS)
併發擴充套件 2 (併發 TS v2)
概念 (概念 TS)
範圍 (範圍 TS)
反射 (反射 TS)
數學特殊函式 (特殊函式 TR)
實驗性非 TS
模式匹配
線性代數
std::execution
契約
2D 圖形
 
 
 
bool compare_exchange_weak( std::shared_ptr<T>& expected, const std::shared_ptr<T>& desired,
                            std::memory_order success, std::memory_order failure ) noexcept;
(1)
bool compare_exchange_weak( std::shared_ptr<T>& expected, std::shared_ptr<T>&& desired,
                            std::memory_order success, std::memory_order failure ) noexcept;
(2)
bool compare_exchange_weak( std::shared_ptr<T>& expected, const std::shared_ptr<T>& desired,
                            std::memory_order order = std::memory_order_seq_cst ) noexcept;
(3)
bool compare_exchange_weak( std::shared_ptr<T>& expected, std::shared_ptr<T>&& desired,
                            std::memory_order order = std::memory_order_seq_cst ) noexcept;
(4)
bool compare_exchange_strong( std::shared_ptr<T>& expected, const std::shared_ptr<T>& desired,
                              std::memory_order success, std::memory_order failure ) noexcept;
(5)
bool compare_exchange_strong( std::shared_ptr<T>& expected, std::shared_ptr<T>&& desired,
                              std::memory_order success, std::memory_order failure ) noexcept;
(6)
bool compare_exchange_strong( std::shared_ptr<T>& expected, const std::shared_ptr<T>& desired,
                              std::memory_order order = std::memory_order_seq_cst ) noexcept;
(7)
bool compare_exchange_strong( std::shared_ptr<T>& expected, std::shared_ptr<T>&& desired,
                              std::memory_order order = std::memory_order_seq_cst ) noexcept;
(8)

原子地比較 *this 中底層 shared_ptrexpected,如果它們等價,則將前者替換為 desired(執行讀-修改-寫操作)。否則,將 *this 中儲存的實際值載入到 expected 中(執行載入操作)。替換操作透過 shared_ptr 的複製或移動賦值運算子進行,視情況而定。

兩個 shared_ptr 等價當且僅當它們儲存相同的指標值並共享所有權。

讀-修改-寫和載入操作的記憶體模型分別為 successfailure。對於過載 (3,4,7,8)order 用於讀-修改-寫和載入操作,除了如果 order == std::memory_order_acq_relorder == std::memory_order_release,載入操作分別使用 std::memory_order_acquirestd::memory_order_relaxed

弱版本 (1-4) 可能會虛假失敗。

目錄

[編輯] 引數

expected - 對原子物件中預期值的引用
desired - 如果原子物件符合預期,則儲存到原子物件中的值
成功 - 如果比較成功,讀-修改-寫操作的記憶體同步順序。所有值都允許
failure - 如果比較失敗,載入操作的記憶體同步順序。不能是 std::memory_order_releasestd::memory_order_acq_rel,且不能指定比 success 更強的順序
順序 - 兩個操作的記憶體同步順序

[編輯] 返回值

如果底層原子值已更改,則為 true,否則為 false

[編輯] 備註

atomic_shared_ptr 物件本身的所有更改,以及所有關聯的 use_count 增量,都保證原子執行。關聯的 use_count 減量發生在原子操作之後,但不需要成為原子操作的一部分。任何關聯的銷燬或解除分配操作發生在原子操作之後,不屬於原子操作的一部分。

如果比較交換操作返回 true,則在原子更新步驟之後不會訪問 expected。如果它返回 false,則 expected 會用嘗試原子更新中從 atomic_shared_ptr 物件讀取的現有值進行更新。與寫入 expected 對應的 use_count 更新是原子操作的一部分,但寫入 expected 本身不需要成為原子操作的一部分。

對於過載 (1,3,5,7),在原子更新步驟之後不會訪問 desired

對於過載 (2,4,6,8)desired 僅在比較交換操作返回 true 時才被移動;移動發生在原子更新步驟之後。

[編輯] 注意

函式的弱形式 (1-4) 允許虛假失敗,即,即使 *thisexpected 等價,也表現得像它們不等價一樣。當比較交換在迴圈中時,弱版本在某些平臺上會產生更好的效能。

[編輯] 另請參閱

特化 std::shared_ptr 的原子操作
(函式模板) [編輯]