atomic_compare_exchange_weak, atomic_compare_exchange_strong, atomic_compare_exchange_weak_explicit, atomic_compare_exchange_strong_explicit
|
ヘッダーで定義
<stdatomic.h>
|
||
|
_Bool atomic_compare_exchange_strong
(
volatile
A
*
obj,
C * expected, C desired ) ; |
(1) | (C11以降) |
|
_Bool atomic_compare_exchange_weak
(
volatile
A
*
obj,
C * expected, C desired ) ; |
(2) | (C11以降) |
|
_Bool atomic_compare_exchange_strong_explicit
(
volatile
A
*
obj,
C
*
expected, C desired,
|
(3) | (C11以降) |
|
_Bool atomic_compare_exchange_weak_explicit
(
volatile
A
*
obj,
C
*
expected, C desired,
|
(4) | (C11以降) |
obj
が指すメモリの内容と
expected
が指すメモリの内容をアトミックに比較し、それらがビット単位で等しい場合、前者を
desired
で置き換えます(読み込み-修正-書き込み操作を実行)。それ以外の場合、
obj
が指すメモリの実際の内容を
*expected
にロードします(ロード操作を実行)。
読み込み-修正-書き込み操作とロード操作のメモリモデルは、それぞれ
succ
および
fail
です。(1-2) バージョンはデフォルトで
memory_order_seq_cst
を使用します。
関数の弱い形式((2)と(4))は、偽の失敗を許容します。つまり、 * obj ! = * expected が等しい場合でも、等しくないかのように動作することがあります。比較交換がループ内で行われる場合、弱いバージョンは一部のプラットフォームでより優れたパフォーマンスを発揮します。弱い比較交換がループを必要とし、強い比較交換がループを必要としない場合、強いバージョンが推奨されます。
これはすべての
generic function
に対して定義された
atomic object types
A
です。引数はvolatile atomic型へのポインタであり、非volatileと
volatile
(メモリマップドI/Oなど)の両方のatomicオブジェクトのアドレスを受け入れます。また、volatile atomicオブジェクトにこの操作を適用する際にはvolatileセマンティクスが保持されます。
C
は
A
に対応する非atomic型です。
ジェネリック関数の名前がマクロであるか、外部リンケージで宣言された識別子であるかは未規定です。実際の関数にアクセスするために(例えば括弧で囲んで ( atomic_compare_exchange ) ( ... ) のように)マクロ定義が抑制された場合、またはプログラムがジェネリック関数の名前で外部識別子を定義した場合、動作は未定義です。
目次 |
パラメータ
| obj | - | テストおよび変更するアトミックオブジェクトへのポインタ |
| expected | - | アトミックオブジェクト内に存在することが期待される値へのポインタ |
| desired | - | 期待値と一致した場合にアトミックオブジェクトに格納する値 |
| succ | - | 比較が成功した場合の読み込み-修正-書き込み操作のメモリ同期順序。すべての値が許可されます。 |
| fail | - |
比較が失敗した場合のロード操作のメモリ同期順序。
memory_order_release
または
memory_order_acq_rel
にはできず、
succ
よりも強い順序付けを指定することはできません
|
戻り値
比較の結果:
true
は
*obj
が
*exp
と等しい場合、
false
はそれ以外の場合を示します。
注記
atomic_compare_exchange_*
ファミリーの動作は、以下の処理がアトミックに実行された場合と同様です:
参考文献
- C17規格 (ISO/IEC 9899:2018):
-
- 7.17.7.4 atomic_compare_exchange ジェネリック関数 (p: 207)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.17.7.4 atomic_compare_exchange汎用関数 (p: 283-284)
関連項目
|
アトミックオブジェクトの値と値を交換する
(関数) |
|
|
C++ documentation
for
atomic_compare_exchange_weak
,
atomic_compare_exchange_strong
,
atomic_compare_exchange_weak_explicit
,
atomic_compare_exchange_strong_explicit
|
|