Namespaces
Variants

std:: atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
atomic_is_lock_free
(C++11)
Free functions for atomic flags
ヘッダーで定義 <atomic>
template < class T >
bool atomic_is_lock_free ( const volatile std:: atomic < T > * obj ) noexcept ;
(1) (C++11以降)
template < class T >
bool atomic_is_lock_free ( const std:: atomic < T > * obj ) noexcept ;
(2) (C++11以降)
#define ATOMIC_BOOL_LOCK_FREE     /* unspecified */

#define ATOMIC_CHAR_LOCK_FREE     /* unspecified */
#define ATOMIC_CHAR16_T_LOCK_FREE /* unspecified */
#define ATOMIC_CHAR32_T_LOCK_FREE /* unspecified */
#define ATOMIC_WCHAR_T_LOCK_FREE  /* unspecified */
#define ATOMIC_SHORT_LOCK_FREE    /* unspecified */
#define ATOMIC_INT_LOCK_FREE      /* unspecified */
#define ATOMIC_LONG_LOCK_FREE     /* unspecified */
#define ATOMIC_LLONG_LOCK_FREE    /* unspecified */

#define ATOMIC_POINTER_LOCK_FREE  /* unspecified */
(3) (C++11以降)
#define ATOMIC_CHAR8_T_LOCK_FREE  /* unspecified */
(4) (C++20以降)
1,2) obj が指すアトミックオブジェクトがロックフリーで実装されているかどうかを判定します。これは obj - > is_lock_free ( ) を呼び出した場合と同様です。同一のプログラム実行内では、同じ型の全てのアトミックオブジェクトに対するロックフリー問い合わせの結果は同じになります。
3,4) 整数定数式に展開され、その値は以下の通りです:
  • 0 ロックフリーでない組み込みアトミック型の場合、
  • 1 場合によっては ロックフリーとなる組み込みアトミック型の場合、
  • 2 常にロックフリーとなる組み込みアトミック型の場合。

目次

パラメータ

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

戻り値

true * obj がロックフリーなアトミックである場合、 false がそれ以外の場合。

注記

std::atomic_flag を除くすべてのアトミック型は、ロックフリーなアトミックCPU命令を使用する代わりに、ミューテックスやその他のロック操作を使用して実装される可能性があります。アトミック型は 場合によっては ロックフリーであることも許可されています:例えば、特定の型に対してロックフリーなアトミックアクセスをサポートするサブアーキテクチャが一部のみである場合(x86-64の CMPXCHG16B 命令など)、アトミック操作がロックフリーかどうかは実行時まで判明しない可能性があります。

C++標準は、ロックフリーなアトミック操作がアドレスフリーでもあること、すなわち共有メモリを使用したプロセス間通信に適していることを推奨しています(必須ではありません)。

#include <atomic>
#include <iostream>
#include <utility>
struct A { int a[4]; };
struct B { int x, y; };
int main()
{
    std::atomic<A> a;
    std::atomic<B> b;
    std::cout << std::boolalpha
              << "std::atomic<A> is lock free? "
              << std::atomic_is_lock_free(&a) << '\n'
              << "std::atomic<B> is lock free? "
              << std::atomic_is_lock_free(&b) << '\n';
}

出力例:

std::atomic<A> is lock free? false
std::atomic<B> is lock free? true

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3249 C++11 atomic_is_lock_free はポインタ経由で指定されており、
曖昧で無効なポインタ値を受け入れる可能性があった
アトミックオブジェクト経由で
指定

関連項目

アトミックオブジェクトがロックフリーかどうかをチェックする
( std::atomic<T> の公開メンバ関数)
ロックフリーなブーリアン型アトミックオブジェクト
(クラス)
[static] (C++17)
型が常にロックフリーであることを示す
( std::atomic<T> の公開静的メンバ定数)
(C++20で非推奨) (C++26で削除)
std::shared_ptr に対するアトミック操作を特殊化
(関数テンプレート)
Cドキュメント for atomic_is_lock_free
Cドキュメント for ATOMIC_*_LOCK_FREE