Namespaces
Variants

atomic_is_lock_free

From cppreference.net
ヘッダーで定義 <stdatomic.h>
_Bool atomic_is_lock_free ( const volatile A * obj ) ;
(C11以降)

A obj が指すオブジェクトの型)の全てのオブジェクトに対するアトミック操作がロックフリーかどうかを判定します。任意のプログラム実行において、同じ型の全てのポインタに対して atomic_is_lock_free を呼び出した結果は同じになります。

これはすべての generic function に対して定義された atomic object types A です。引数はvolatile atomic型へのポインタであり、非volatileと volatile (例:メモリマップドI/O)atomicオブジェクトの両方のアドレスを受け入れます。また、volatile atomicオブジェクトにこの操作を適用する際にはvolatileセマンティクスが保持されます。

ジェネリック関数の名前がマクロであるか、外部リンケージで宣言された識別子であるかは未規定です。実際の関数にアクセスするために(例えば括弧で囲んで ( atomic_is_lock_free ) ( ... ) のように)マクロ定義を抑制した場合、またはプログラムがジェネリック関数の名前で外部識別子を定義した場合、動作は未定義です。

目次

パラメータ

obj - 検査対象のアトミックオブジェクトへのポインタ

戻り値

true A のすべてのオブジェクトに対する操作がロックフリーである場合、 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 Applied to Behavior as published Correct behavior
DR 465 C11 この関数はオブジェクト単位であった この関数は型単位である

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.17.5.1 atomic_is_lock_free ジェネリック関数 (p: 205)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.17.5.1 atomic_is_lock_free汎用関数 (p: 280)

関連項目

指定されたアトミック型がロックフリーであることを示す
(マクロ定数)
C++ documentation for atomic_is_lock_free