std::atomic_is_lock_free, ATOMIC_xxx_LOCK_FREE
| ヘッダー <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 /* 未規定 */ #define ATOMIC_CHAR_LOCK_FREE /* 未規定 */ |
(3) | (C++11以降) |
| #define ATOMIC_CHAR8_T_LOCK_FREE /* 未規定 */ |
(4) | (C++20以降) |
- 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[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
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3249 | C++11 | atomic_is_lock_free はポインタ経由で指定されていましたが、これは曖昧であり、無効なポインタ値を受け入れる可能性がありました。 |
アトミックオブジェクト経由で 指定されました。 |
[編集] 関連項目
| アトミックオブジェクトがロックフリーであるかを確認する ( std::atomic<T> の public メンバ関数) | |
| (C++11) |
ロックフリーなブール型アトミック型 (クラス) |
| [static] (C++17) |
型が常にロックフリーであることを示す ( std::atomic<T> の public static メンバ定数) |
| (C++20 で非推奨)(C++26 で削除) |
std::shared_ptr のアトミック操作の特殊化 (関数テンプレート) |
| C言語のドキュメント for atomic_is_lock_free
| |
| C言語のドキュメント for ATOMIC_*_LOCK_FREE
| |