std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
ヘッダ <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 */ |
(2) | (C++11以上) |
#define ATOMIC_CHAR8_T_LOCK_FREE /* unspecified */ |
(3) | (C++20以上) |
obj
が指すアトミックオブジェクトがロックフリーに実装されているかどうか調べます。 任意の与えられたプログラム実行において、同じ型のポインタの対するロックフリーの問い合わせ結果はすべて同じになります。 - 決してロックフリーにならない組み込みアトミック型に対しては値 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> のパブリックメンバ関数)
| |
std::shared_ptr に対するアトミック操作の特殊化 (関数テンプレート) | |
(C++11) |
ロックフリーなアトミックブーリアン型 (クラス) |
[静的] (C++17) |
型が常にロックフリーであることを表します ( std::atomic<T> のパブリック静的メンバ定数)
|
atomic_is_lock_free の C言語リファレンス
| |
ATOMIC_*_LOCK_FREE の C言語リファレンス
|