名前空間
変種
操作

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

From cppreference.com
 
 
 
 
 
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)

アトミックなshared_ptrである*thisexpectedを比較し、それらが等しければ、前者をdesiredで置き換えます(読み取り-変更-書き込み操作を実行します)。そうでなければ、*thisに格納されている実際の値をexpectedにロードします(ロード操作を実行します)。置き換えは、適切な場合はshared_ptrのコピーまたはムーブ代入演算子によって行われるかのように実行されます。

2つのshared_ptrが等しいとは、それらが同じポインタ値を格納し、所有権を共有している場合かつその場合に限ります。

読み取り-変更-書き込み操作とロード操作のメモリモデルは、それぞれsuccessfailureです。オーバーロード(3,4,7,8)の場合、orderは読み取り-変更-書き込み操作とロード操作の両方に使用されます。ただし、order == std::memory_order_acq_relの場合、またはorder == std::memory_order_releaseの場合は、ロード操作にそれぞれstd::memory_order_acquireおよびstd::memory_order_relaxedが使用されます。

弱いバージョン(1-4)は、偽陽性で失敗する可能性があります。

目次

[編集] パラメータ

expected - アトミックオブジェクトで検出されると予想される値への参照
desired - アトミックオブジェクトが期待どおりの場合に格納する値
success - 比較が成功した場合の読み取り-変更-書き込み操作のメモリ同期順序。すべての値が許可されます。
failure - 比較が失敗した場合のロード操作のメモリ同期順序。 std::memory_order_releaseまたはstd::memory_order_acq_relではありません。また、successよりも強い順序を指定することはできません。
order - 両方の操作のメモリ同期順序

[編集] 戻り値

アトミック値が変更された場合は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)の場合、比較交換操作がtrueを返した場合にのみdesiredはムーブされます。ムーブはアトミック更新ステップの後に行われます。

[編集] 注記

関数の弱い形式(1-4)は、偽陽性で失敗する可能性があります。つまり、*thisexpectedが等しい場合でも等しくないかのように動作します。ループ内に比較交換がある場合、弱いバージョンは一部のプラットフォームでより良いパフォーマンスを発揮します。

[編集] 関連項目

std::shared_ptr のアトミック操作を特殊化する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)