Namespaces
Variants

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

From cppreference.net
**注記**: このコードはC++の関数宣言であり、HTMLタグ、属性、コード内のテキストは翻訳対象外です。C++固有の用語(`compare_exchange_weak`、`shared_ptr`、`memory_order`、`noexcept`など)も翻訳せず、元のフォーマットを保持しています。 このC++コードは翻訳対象外のため、元のまま保持されています。HTMLタグ、属性、コード内のテキストはすべて変更せず、元のフォーマットを維持しています。 **日本語訳:** **注記:** このC++関数宣言には翻訳すべき自然言語テキストが含まれていないため、元のコードはそのまま保持されています。HTMLタグ、属性、コード内のテキストはすべて保持されています。 **注記**: このコードはC++の関数宣言であり、HTMLタグ内のコード部分は翻訳対象外です。C++のキーワード(`bool`, `std::shared_ptr`, `std::memory_order`, `noexcept`など)と構文はそのまま保持されています。 **日本語訳:** **注記:** - C++のキーワード、型名、関数名、テンプレートパラメータなどの技術用語は翻訳せず、原文のまま保持しています - HTMLタグ、属性、コードブロック内のテキストはすべて保持されています - 数値の(7)はそのまま保持されています (注:このHTML要素には翻訳対象のテキストコンテンツが含まれていないため、元の構造をそのまま保持します)
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, 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, 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 * this expected で原子的に比較し、等価である場合、前者を desired で置き換えます(読み込み-修正-書き込み操作を実行)。そうでない場合、 * this に格納されている実際の値を expected に読み込みます(読み込み操作を実行)。置き換えは、 shared_ptr のコピー代入演算子またはムーブ代入演算子によって適切に行われるかのように実行されます。

2つの shared_ptr は、同じポインタ値を格納し、所有権を共有する場合にのみ等価です。

読み込み-変更-書き込み操作と読み込み操作のメモリモデルは、それぞれ success および failure です。オーバーロード (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 のデクリメントはアトミック操作の後に発生しますが、その操作の一部である必要はありません。関連する破棄または解放操作はすべて、アトミック操作の後に発生し、その操作の一部ではありません。

compare-exchange操作が true を返す場合、 expected はアトミック更新ステップの後にアクセスされません。操作が false を返す場合、 expected はアトミック更新の試行において atomic_shared_ptr オブジェクトから読み取られた既存の値で更新されます。 expected への書き込みに対応する use_count の更新はアトミック操作の一部ですが、 expected 自体への書き込みはアトミック操作の一部である必要はありません。

オーバーロード (1,3,5,7) では、 desired はアトミック更新ステップの後にアクセスされません。

オーバーロード (2,4,6,8) の場合、 desired は、比較交換操作が true を返した場合にのみムーブされる。このムーブはアトミックな更新ステップの後に行われる。

注記

弱い形式 (1-4) の関数は、偽の失敗を起こすことが許可されています。つまり、 * this expected が実際には等価である場合でも、等価でないかのように動作することがあります。compare-and-exchange操作がループ内で行われる場合、弱いバージョンは一部のプラットフォームでより優れたパフォーマンスを発揮します。

関連項目

std::shared_ptr に対するアトミック操作を特殊化
(関数テンプレート)