最終更新日時: 2025年10月14日 14時41分25秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<memory>

# std::atomic(C++20)

    namespace std {
      template <class T> struct atomic; // 先行宣言

      template <class T> struct atomic<shared_ptr<T>>;
      template <class T> struct atomic<weak_ptr<T>>;
    }

## 概要

`<memory>`ヘッダでは、`std::shared_ptr`と`std::weak_ptr`クラスに対する`std::atomic`クラスの特殊化を定義する。

これらの特殊化を使用することで、共通のスマートポインタオブジェクトに対する複数スレッドでの操作をアトミックに行える。

### 共通メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++20
`~atomic() = default` | デストラクタ | C++20
`operator=` | 代入演算子 | C++20
`is_lock_free` | オブジェクトがロックフリーに振る舞えるかを判定する | C++20
`store` | 値を書き込む | C++20
`load` | 値を読み込む | C++20
`operator T` | 型Tへの変換演算子 | C++20
`exchange` | 値を入れ替える | C++20
`compare_exchange_weak` | 弱い比較で値を入れ替える | C++20
`compare_exchange_strong` | 強い比較で値を入れ替える | C++20
`wait` | 起床されるまで待機する | C++20
`notify_one` | 待機しているスレッドをひとつ起床させる | C++20
`notify_all` | 待機している全てのスレッドを起床させる | C++20

### 共通メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`value_type` | 要素型となるテンプレートパラメータの型`T`。 `shared_ptr`に対する特殊化では`shared_ptr<T>`となる。 `weak_ptr`に対する特殊化では`weak_ptr<T>`となる | C++20

### 共通メンバ定数

名前 | 説明 | 対応バージョン
--- | --- | ---
`static constexpr bool is_always_lock_free` | 型`T`に対するアトミック操作が常にロックフリー (非ミューテックス) で動作する場合は`true`、そうでなければ`false` | C++20

### 例

    #include <iostream>
    #include <memory>
    #include <thread>

    std::atomic<std::shared_ptr<int>> resource;

    // Producer-Consumerパターン。
    // 供給者スレッドがデータを作成し、消費者スレッドが供給されたデータを使用する
    void producer() {
      std::shared_ptr<int> x{new int(3)};
      resource.store(x);
    }

    void consumer() {
      // データが供給されたら、resourceとyを入れ替える (resourceが空になり、yにデータが入る)。
      std::shared_ptr<int> y;
      while (!(y = resource.exchange(y))) {
      }
      std::cout << *y << std::endl;
    }

    int main()
    {
      std::thread consumer_thread{consumer};
      std::thread producer_thread{producer};

      consumer_thread.join();
      producer_thread.join();
    }

### 出力

    3

## バージョン

### 言語

- C++20

### 処理系

- Clang:
- GCC:
- Visual C++: ??

### 参照

- P0718R2 Revising `atomic_shared_ptr` for C++20
- cplusplus/draft #2824 - add forward declaration of `atomic` class for `atomic<shared_ptr<T>>` (P0718R2)
- P1644R0 Add wait/notify to `atomic<shared_ptr<T>>`
- P3037R6 `constexpr std::shared_ptr` and friends