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++: ??