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

履歴 編集

function
<atomic>

# std::atomic_ref::is_lock_free(C++20)

    bool is_lock_free() const noexcept;

## 概要

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

## 戻り値

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

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

## 備考

- このクラスは、ミューテックスによって実装される場合がある。たとえばシグナルハンドラ内では、ミューテックス実装の場合にデッドロックが発生するため、ロックフリーで実装されている必要がある
- 実行時の状況によらず常にロックフリーに振る舞えるかを表す`atomic_ref::is_always_lock_free`メンバ定数が定義されているが、こちらは動的リンクライブラリのバージョンアップなどで、将来的にロックフリーに振る舞う可能性がある場合などに値が変動する

## 例

    #include <iostream>
    #include <atomic>

    int main()
    {
      int value = 1;
      std::atomic_ref<int> x{value};

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

### 出力例

    atomic_ref<int> is lock-free

## バージョン

### 言語

- C++20

### 処理系

- Clang: 9.0 ❌
- GCC: 10.1 ✅
- Visual C++: ??

## 参照

- P1960R0 NB Comment Changes Reviewed by SG1
  - 対象を「オブジェクト」から「`atomic_ref<T>`型のすべてのオブジェクト」に変更