Namespaces
Variants

std::atomic_ref<T>:: compare_exchange_weak, std::atomic_ref<T>:: compare_exchange_strong

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
bool compare_exchange_weak

( value_type & expected, value_type desired,
std:: memory_order success,

std:: memory_order failure ) const noexcept ;
(1) (C++26以降 constexpr)
bool compare_exchange_weak

( value_type & expected, value_type desired,
std:: memory_order order =

std:: memory_order_seq_cst ) const noexcept ;
(2) (C++26以降 constexpr)
bool compare_exchange_strong

( value_type & expected, value_type desired,
std:: memory_order success,

std:: memory_order failure ) const noexcept ;
(3) (C++26以降 constexpr)
bool compare_exchange_strong

( value_type & expected, value_type desired,
std:: memory_order order =

std:: memory_order_seq_cst ) const noexcept ;
(4) (C++26以降 constexpr)

参照先オブジェクトの 値表現 expected の値表現とアトミックに比較し、それらがビット単位で等しい場合、前者を desired で置き換えます(読み込み-修正-書き込み操作を実行)。そうでない場合、参照先オブジェクトに格納されている実際の値を expected にロードします(ロード操作を実行)。

1,3) 読み込み-修正-書き込み操作とロード操作のメモリモデルは、それぞれ success および failure です。
2,4) order は読み込み-修正-書き込み操作とロード操作の両方に使用されます。ただし、 std:: memory_order_acquire および std:: memory_order_relaxed がロード操作に使用される場合は、 order がそれぞれ std:: memory_order_acq_rel または std:: memory_order_release の場合です。

これらのオーバーロードは、 std:: is_const_v < T > false の場合にのみ、オーバーロード解決に参加します。

failure std:: memory_order_relaxed std:: memory_order_consume std:: memory_order_acquire または std:: memory_order_seq_cst でない場合、動作は未定義です。

目次

パラメータ

expected - オブジェクト内に存在することが期待される値への参照( atomic_ref オブジェクトによって参照される)
desired - 期待値と一致した場合に参照先オブジェクトに格納する値
success - 比較が成功した場合の読み込み-変更-書き込み操作に対するメモリ同期順序
failure - 比較が失敗した場合の読み込み操作に対するメモリ同期順序
order - 両方の操作に対するメモリ同期順序

戻り値

true 参照先オブジェクトの変更が成功した場合、 false それ以外の場合。

注記

比較とコピーはビット単位で行われます( std::memcmp および std::memcpy と同様)。コンストラクタ、代入演算子、比較演算子は使用されません。

弱い形式の関数 (1,2) は、偽の失敗を起こす可能性があります。つまり、 * this ! = expected であるかのように動作することがあります。比較交換操作がループ内で行われる場合、一部のプラットフォームでは弱いバージョンの方が優れたパフォーマンスを発揮します。

弱い比較交換がループを必要とし強い比較交換がそれを必要としない場合、 value_type のオブジェクト表現がトラップビットを含む可能性がある場合、または同じ値に対して複数のオブジェクト表現を提供する場合(例:浮動小数点NaN)を除き、強い比較交換が望ましい。これらの場合、弱い比較交換は通常、何らかの安定したオブジェクト表現に素早く収束するため機能する。

いくつかのメンバーの値表現には参加するが他のメンバーには参加しないビットを持つ共用体の場合、そのようなパディングビットはアクティブなメンバーの値表現に参加していないとき不定値を持つため、比較交換操作は常に失敗する可能性があります。

オブジェクトの値表現に決して参加しないパディングビットは無視されます。

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3508
( P3323R1 )
C++20 compare_exchange_weak および compare_exchange_strong
const T に対して無意味であった
非constの T のみを受け入れるように制約