atomic_is_lock_free
From cppreference.com
| ヘッダ <stdatomic.h>で定義 |
||
| _Bool atomic_is_lock_free( const volatile A* obj ); |
(C11 以降) | |
obj が指す型 A のすべてのオブジェクトに対するアトミック操作がロックフリーであるかどうかを判断します。任意のプログラム実行において、atomic_is_lock_free の呼び出し結果は、同じ型のすべてのポインタに対して同じになります。
これは、すべての アトミックオブジェクト型 A に対して定義された 汎用関数 です。引数は、volatile でないアトミックオブジェクトと volatile (例:メモリマップドI/O)アトミックオブジェクトの両方のアドレスを受け入れるために、volatile アトミック型へのポインタであり、volatile アトミックオブジェクトにこの操作を適用する際に volatile セマンティクスが保持されます。
汎用関数の名前がマクロであるか、外部リンケージで宣言された識別子であるかは未規定です。実際の関数にアクセスするためにマクロ定義が抑制された場合(例:(atomic_is_lock_free)(...) のように括弧で囲んだ場合)、またはプログラムが汎用関数と同じ名前の外部識別子を定義した場合、その動作は未定義です。
目次 |
[編集] パラメータ
| obj | - | 検査するアトミックオブジェクトへのポインタ |
[編集] 戻り値
型 A のすべてのオブジェクトに対する操作がロックフリーの場合は true、そうでない場合は false。
[編集] 例
このコードを実行
#include <stdio.h> #include <stdatomic.h> _Atomic struct A { int a[100]; } a; _Atomic struct B { int x, y; } b; int main(void) { printf("_Atomic struct A is lock free? %s\n", atomic_is_lock_free(&a) ? "true" : "false"); printf("_Atomic struct B is lock free? %s\n", atomic_is_lock_free(&b) ? "true" : "false"); }
実行結果の例
_Atomic struct A is lock free? false _Atomic struct B is lock free? true
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に発行されたC規格に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| DR 465 | C11 | この関数はオブジェクトごとだった | この関数は型ごとである |
[編集] 参照
- C17標準 (ISO/IEC 9899:2018)
- 7.17.5.1 The atomic_is_lock_free generic function (p: 205)
- C11標準 (ISO/IEC 9899:2011)
- 7.17.5.1 The atomic_is_lock_free generic function (p: 280)
[編集] 関連項目
| 指定されたアトミック型がロックフリーであることを示す (マクロ定数) | |
| C++ ドキュメント (atomic_is_lock_free)
| |