std::atomic_ref<T>:: compare_exchange_weak, std::atomic_ref<T>:: compare_exchange_strong
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
atomic_ref::compare_exchange_strong
atomic_ref::compare_exchange_weak
|
||||
|
(C++26)
|
||||
|
Operations for arithmetic types
(except
bool
and pointer-to-object)
|
||||
|
Operations for integral types
(except
bool
and pointer-to-object)
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
|
Operations for integral types
(except
bool
)
|
||||
| Constants | ||||
|
bool
compare_exchange_weak
(
value_type
&
expected, value_type desired,
|
(1) | (C++26以降 constexpr) |
|
bool
compare_exchange_weak
(
value_type
&
expected, value_type desired,
|
(2) | (C++26以降 constexpr) |
|
bool
compare_exchange_strong
(
value_type
&
expected, value_type desired,
|
(3) | (C++26以降 constexpr) |
|
bool
compare_exchange_strong
(
value_type
&
expected, value_type desired,
|
(4) | (C++26以降 constexpr) |
参照先オブジェクトの 値表現 を expected の値表現とアトミックに比較し、それらがビット単位で等しい場合、前者を desired で置き換えます(読み込み-修正-書き込み操作を実行)。そうでない場合、参照先オブジェクトに格納されている実際の値を expected にロードします(ロード操作を実行)。
これらのオーバーロードは、 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
のみを受け入れるように制約
|
例
|
このセクションは不完全です
理由: 例がありません |