- memory[meta header]
- std[meta namespace]
- class template[meta id-type]
- cpp20[meta cpp]
namespace std {
template <class T> struct atomic; // 先行宣言
template <class T> struct atomic<shared_ptr<T>>;
template <class T> struct atomic<weak_ptr<T>>;
}
- shared_ptr[link shared_ptr.md]
- weak_ptr[link weak_ptr.md]
<memory>
ヘッダでは、std::shared_ptr
とstd::weak_ptr
クラスに対するstd::atomic
クラスの特殊化を定義する。
これらの特殊化を使用することで、共通のスマートポインタオブジェクトに対する複数スレッドでの操作をアトミックに行える。
名前 |
説明 |
対応バージョン |
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 (!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();
}
- std::atomic<std::shared_ptr>[color ff0000]
- resource.store[link /reference/atomic/atomic/store.md]
- resource.exchange[link /reference/atomic/atomic/exchange.md]
- consumer_thread.join()[link /reference/thread/thread/join.md]
- producer_thread.join()[link /reference/thread/thread/join.md]