最終更新日時(UTC):
が更新

履歴 編集

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_ptrstd::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

処理系

参照