名前空間
変種
操作

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

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

個々の`weak_ptr`を、*thisにあるものと比較し、それらが等しい場合は、desiredで置き換えます(読み取り・変更・書き込み操作を実行)。それ以外の場合は、*thisに格納されている実際の値をexpectedにロードします(ロード操作を実行)。置き換えは、適切な場合は`weak_ptr`のコピーまたはムーブ代入演算子によって行われます。

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

読み取り・変更・書き込み操作とロード操作のメモリモデルは、それぞれsuccessfailureです。オーバーロード(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 - アトミックオブジェクトが期待どおりの場合に格納する値
success - 比較が成功した場合の読み取り・変更・書き込み操作のメモリ同期順序。すべての値が許可されます。
failure - 比較が失敗した場合のロード操作のメモリ同期順序。std::memory_order_releaseまたはstd::memory_order_acq_relであることはできず、successよりも強い順序を指定することはできません。
order - 両方の操作のメモリ同期順序

[編集] 戻り値

アトミック値が変更された場合は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)は、偽陽性で失敗する可能性があります。つまり、*thisexpectedが等しい場合でも、等しくないかのように動作します。比較交換がループ内にある場合、弱いバージョンは一部のプラットフォームでより良いパフォーマンスを発揮します。

[編集] 関連項目

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