最終更新日時(UTC): 2024年06月11日 13時45分38秒
Akira Takahashi が更新

履歴 編集

function
<atomic>

# std::atomic::is_lock_free(C++11)

    bool is_lock_free() const volatile noexcept;
    bool is_lock_free() const noexcept;

## 概要

オブジェクトに対する操作がロックフリーに振る舞えるかを判定する

## 戻り値

オブジェクトに対する操作がロックフリーに振る舞えるなら`true`、そうでなければ`false`を返す。

`false`を返す場合は、ロックで実装されることを意味する。

## 備考

- このクラスは、ミューテックスによって実装される場合がある。たとえばシグナルハンドラ内では、ミューテックス実装の場合にデッドロックが発生するため、ロックフリーで実装されている必要がある
- 実行時の状況によらず常にロックフリーに振る舞えるかを表す`atomic::is_always_lock_free`メンバ定数 (C++17) が定義されているが、こちらは動的リンクライブラリのバージョンアップなどで、将来的にロックフリーに振る舞う可能性がある場合などに値が変動する
- また、コンパイル時の型レベルでのロックフリー保証をあきらめることで、適正なアライメントをもつアトミック変数のみを対象とした効率的実装を選択できる場合がある

## 例

    #include <iostream>
    #include <atomic>

    int main()
    {
      std::atomic<int> x(3);

      if (x.is_lock_free()) {
        std::cout << "atomic<int> is lock-free" << std::endl;
      }
      else {
        std::cout << "atomic<int> isn't lock-free" << std::endl;
      }
    }

### 出力例

    atomic<int> is lock-free

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2012 ✅, 2013 ✅

## 関連項目

- `std::atomic`クラスの`is_always_lock_free`メンバ定数

## 参照

- N2427 C++ Atomic Types and Operations
- N2992 More Collected Issues with Atomics - Lock Free