std::atomic(std::weak_ptr)
template <class T> struct std::atomic<std::weak_ptr<T>>; |
(C++20以上) | |
std::weak_ptr<T> に対する std::atomic のテンプレート部分特殊化は、 weak_ptr オブジェクトをアトミックに操作することを可能とします。
複数の実行のスレッドが同期せずに同じ std::weak_ptr オブジェクトにアクセスし、それらのアクセスのいずれかが weak_ptr の非 const メンバ関数を使用する場合、それらのアクセスがすべて std::atomic<std::weak_ptr<T>> のインスタンスを通して行われたのでなければ、データ競合が発生します。
関連する use_count のインクリメントは、アトミック操作の一部であることが保証されます。 関連する use_count のデクリメントは、アトミック操作に対して後続配列されますが、その一部ではありません。 ただし CAS の失敗で expected
が上書きされるときの use_count は除きます。 関連するあらゆる削除および解放は、アトミック更新処理に対して後続配列され、アトミック操作の一部ではありません。
std::weak_ptr および std::shared_ptr の制御ブロックはスレッドセーフであることに注意してください。 異なる非アトミックな std::weak_ptr オブジェクトは、これらのインスタンスがコピーされ内部的に同じ制御ブロックを共有しているときでも、 operator= や reset といった変更操作を使用して複数のスレッドから同時にアクセスできます。
型 T は不完全型でも構いません。
[編集] メンバ型
メンバ型 | 定義 |
value_type
|
std::weak_ptr<T> |
[編集] メンバ関数
std::atomic の特殊化されていないすべての関数は、この特殊化でも提供されます。 追加のメンバ関数はありません。
atomic<weak_ptr<T>>::atomic
constexpr atomic() noexcept = default; |
(1) | |
atomic(std::weak_ptr<T> desired) noexcept; |
(2) | |
atomic(const atomic&) = delete; |
(3) | |
weak_ptr<T>
をデフォルト構築された値に初期化します。atomic<weak_ptr<T>>::operator=
void operator=(const atomic&) = delete; |
(1) | |
void operator=(std::weak_ptr<T> desired) noexcept; |
(2) | |
atomic<weak_ptr<T>>::is_lock_free
bool is_lock_free() const noexcept; |
||
この型のすべてのオブジェクトに対するアトミック操作がロックリーであれば true、そうでなければ false を返します。
atomic<weak_ptr<T>>::store
void store(std::weak_ptr<T> desired, std::memory_order order = std::memory_order_seq_cst) noexcept; |
||
*this の値を desired
の値とアトミックに置き換えます。 置き換えは p.swap(desired) によって行われたかのように行われます。 ただし p はベースとなる std::weak_ptr<T> です。 メモリは order
に従って順序付けされます。 order
が std::memory_order_consume、 std::memory_order_acquire、 または std::memory_order_acq_rel の場合、動作は未定義です。
atomic<weak_ptr<T>>::load
std::weak_ptr<T> load(std::memory_order order = std::memory_order_seq_cst) const noexcept; |
||
ベースとなる std::weak_ptr<T> のコピーをアトミックに返します。 メモリは order
に従って順序付けされます。 order
が std::memory_order_release または std::memory_order_acq_rel の場合、動作は未定義です。
atomic<weak_ptr<T>>::operator std::weak_ptr<T>
operator std::weak_ptr<T>() const noexcept; |
||
return load(); と同等です。
atomic<weak_ptr<T>>::exchange
std::weak_ptr<T> exchange(std::weak_ptr<T> desired, std::memory_order order = std::memory_order_seq_cst) noexcept; |
||
ベースとなる std::weak_ptr<T> を desired
でアトミックに置き換え、 p がその置き換えの直前に持っていた値のコピーを返します。 置き換えは p.swap(desired) によって行われたかのように行われます。 ただし p はベースとなる std::shared_ptr<T> です。 メモリは order
に従って順序付けされます。 これはアトミック読み込み-変更-書き込み操作です。
atomic<weak_ptr<T>>::compare_exchange_weak, compare_exchange_strong
bool compare_exchange_strong(std::weak_ptr<T>& expected, std::weak_ptr<T> desired, std::memory_order success, std::memory_order failure) noexcept; |
(1) | |
bool compare_exchange_weak(std::weak_ptr<T>& expected, std::weak_ptr<T> desired, std::memory_order success, std::memory_order failure) noexcept; |
(2) | |
bool compare_exchange_strong(std::weak_ptr<T>& expected, std::weak_ptr<T> desired, std::memory_order order = std::memory_order_seq_cst) noexcept; |
(3) | |
bool compare_exchange_weak(std::weak_ptr<T>& expected, std::weak_ptr<T> desired, std::memory_order order = std::memory_order_seq_cst) noexcept; |
(4) | |
expected
と同じポインタ値を格納していて、それと所有権を共有している場合、または、ベースと expected
がどちらも空の場合、 desired
からベースとなる std::weak_ptr<T> に代入を行い、 true を返し、 success
に従ってメモリを順序付けします。 そうでなければ、ベースとなる std::weak_ptr<T> から expected
に代入を行い、 false を返し、 failure
に従ってメモリを順序付けします。 failure
が std::memory_order_release または std::memory_order_acq_rel であれば、動作は未定義です。 成功した場合、この操作は *this に対するアトミック読み込み-変更-書き込み操作であり、アトミック更新後 expected
はアクセスされません。 失敗した場合、この操作は *this に対するアトミックロード操作であり、 expected
はそのアトミックオブジェクトから読み込んだ既存の値で更新されます。 expected
の use_count に対する更新はこのアトミック操作の一部ですが、書き込み自体 (および後続の解放/削除) はそうであるとは限りません。fail_order
は order
と同じですが、 std::memory_order_acq_rel は std::memory_order_acquire に置き換えられ、 std::memory_order_release は std::memory_order_relaxed に置き換えられます。fail_order
は order
と同じですが、 std::memory_order_acq_rel は std::memory_order_acquire に置き換えられ、 std::memory_order_release は std::memory_order_relaxed に置き換えられます。
[編集] メンバ定数
唯一の標準の std::atomic のメンバ定数 is_always_lock_free
は、この特殊化によっても提供されます。
atomic<weak_ptr<T>>::is_always_lock_free
static constexpr bool is_always_lock_free = /*implementation-defined*/; |
||
[編集] 例
This section is incomplete Reason: no example |
[編集] 関連項目
(C++11) |
atomic クラステンプレートと bool 型、整数型、ポインタ型に対する特殊化 (クラステンプレート) |