std::atomic_ref<T>::compare_exchange_weak, std::atomic_ref<T>::compare_exchange_strong
bool compare_exchange_weak( T& expected, T desired, std::memory_order success, | (1) | (C++20以上) |
bool compare_exchange_weak( T& expected, T desired, std::memory_order order = | (2) | (C++20以上) |
bool compare_exchange_strong( T& expected, T desired, std::memory_order success, | (3) | (C++20以上) |
bool compare_exchange_strong( T& expected, T desired, std::memory_order order = | (4) | (C++20以上) |
参照先のオブジェクトの値表現を expected
の値表現とアトミックに比較し、それらがビット単位で等しければ前者を desired
で置き換えます (読み込み-変更-書き込み操作を行います)。 そうでなければ、参照先のオブジェクトに格納されている実際の値を expected
にロードします (ロード操作を行います)。
読み込み-変更-書き込みおよびロード操作に対するメモリモデルはそれぞれ success
および failure
です。 (2) および (4) のバージョンでは、読み込み-変更-書き込みとロード操作の両方に order
が使用されますが、 order ==std::memory_order_acq_rel または order ==std::memory_order_release の場合、ロード操作に対してはそれぞれ std::memory_order_acquire および std::memory_order_relaxed が使用されます。
目次 |
[編集]引数
expected | - | atomic_ref オブジェクトによって参照されるオブジェクト内にあることが期待される値を指す参照 |
desired | - | 期待通りの場合に参照先のオブジェクトに格納する値 |
success | - | 比較が成功した場合の読み込み-変更-書き込み操作に対するメモリ同期順序付け。 すべての値が指定できます |
failure | - | 比較が失敗した場合のロード操作に対するメモリ同期順序付け。 std::memory_order_release および std::memory_order_acq_rel は指定できません |
order | - | 両方の動作に対するメモリ同期順序付け |
[編集]戻り値
参照先のオブジェクトの変更に成功した場合は true、そうでなければ false。
[編集]ノート
比較やコピーはビット単位です (std::memcmp や std::memcpy と同様です)。 コンストラクタ、代入演算子、比較演算子は使用されません。
この関数の weak 版 (1-2) は spurious に失敗することが許されています。 つまり、等しい場合でも *this != expected であるかのように動作することがあります。 compare-and-exchange がループ内にある場合、プラットフォームによっては weak 版の方が良い性能を発揮します。
weak 版の compare-and-exchange がループを要求し、 strong 版がそうでないとき、 T
のオブジェクト表現にトラップビットが含まれていたり、同じ値に対して複数のオブジェクト表現を提供する (浮動小数点の NaN など) 可能性がなければ、 strong 版の方が好まれます。 それらの可能性がある場合は、一般的に weak 版の compare-and-exchange の方が、何らかの安定したオブジェクト表現に急速に収束するため、上手く行きます。
何らかのメンバの値表現に寄与するけれども他のメンバの値表現に寄与しないビットを持つ共用体の場合、そのようなビットはアクティブなメンバの値表現に寄与しないときは不定の値を持つため、 compare-and-exchange は常に失敗する可能性があります。
オブジェクトの値表現に決して寄与しないパディングビットは無視されます。
[編集]例
This section is incomplete Reason: no example |