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 /* unspecified */
#define ATOMIC_CHAR_LOCK_FREE /* unspecified */
|
(3) | (C++11以降) |
|
#define ATOMIC_CHAR8_T_LOCK_FREE /* unspecified */
|
(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[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>
の公開メンバ関数)
|
|
|
(C++11)
|
ロックフリーなブーリアン型アトミックオブジェクト
(クラス) |
|
[static]
(C++17)
|
型が常にロックフリーであることを示す
(
std::atomic<T>
の公開静的メンバ定数)
|
|
(C++20で非推奨)
(C++26で削除)
|
std::shared_ptr
に対するアトミック操作を特殊化
(関数テンプレート) |
|
Cドキュメント
for
atomic_is_lock_free
|
|
|
Cドキュメント
for
ATOMIC_*_LOCK_FREE
|
|