名前空間
変種
操作

std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE

提供: cppreference.com
< cpp‎ | atomic
 
 
 
ヘッダ <atomic> で定義
(1) (C++11以上)
template< class T >
bool atomic_is_lock_free( const volatile std::atomic<T>* obj ) noexcept;
template< class T >
bool atomic_is_lock_free( const std::atomic<T>* obj ) noexcept;
#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 */
(2) (C++11以上)
#define ATOMIC_CHAR8_T_LOCK_FREE  /* unspecified */
(3) (C++20以上)
1) obj->is_lock_free() を呼び出したかのように、 obj が指すアトミックオブジェクトがロックフリーに実装されているかどうか調べます。 任意の与えられたプログラム実行において、同じ型のポインタの対するロックフリーの問い合わせ結果はすべて同じになります。
2,3) 以下の値を持つ整数定数式に展開されます。
  • 決してロックフリーにならない組み込みアトミック型に対しては値 0
  • 時々ロックフリーになることがある組み込みアトミック型に対しては値 1
  • 常にロックフリーである組み込みアトミック型に対しては値 2

目次

[編集] 引数

obj - 調べるアトミックオブジェクトを指すポインタ

[編集] 戻り値

*obj がロックフリーなアトミックオブジェクトであれば true、そうでなければ false

[編集] ノート

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

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

[編集]

#include <iostream>
#include <utility>
#include <atomic>
 
struct A { int a[100]; };
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

[編集] 関連項目

アトミックオブジェクトがロックフリーかどうか調べます
(std::atomic<T>のパブリックメンバ関数) [edit]
std::shared_ptr に対するアトミック操作の特殊化
(関数テンプレート)
ロックフリーなアトミックブーリアン型
(クラス) [edit]
[静的] (C++17)
型が常にロックフリーであることを表します
(std::atomic<T>のパブリック静的メンバ定数) [edit]
atomic_is_lock_freeC言語リファレンス
ATOMIC_*_LOCK_FREEC言語リファレンス