Namespaces
Variants

std:: atomic <std::weak_ptr>

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
ヘッダーで定義 <memory>
template < class T > struct std:: atomic < std:: weak_ptr < T >> ;
(C++20以降)

std::atomic の部分テンプレート特殊化は、 std:: weak_ptr < T > に対して行われ、ユーザーがweak_ptrオブジェクトをアトミックに操作することを可能にします。

複数の実行スレッドが同期なしに同一の std::weak_ptr オブジェクトにアクセスし、そのいずれかのアクセスが weak_ptr の非constメンバ関数を使用する場合、 std:: atomic < std:: weak_ptr > のインスタンスを通じてすべてのアクセスが行われない限り、データ競合が発生します。

関連する 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)
1) 基となる weak_ptr<T> をデフォルト構築された値で初期化します。
2) 基となる weak_ptr<T> desired のコピーで初期化します。 std::atomic 型と同様に、初期化はアトミック操作ではありません。
3) atomic型はコピー/ムーブ構築できません。

atomic<weak_ptr<T>>:: operator=

void operator = ( const atomic & ) = delete ;
(1)
void operator = ( std:: weak_ptr < T > desired ) noexcept ;
(2)
1) アトミック型はコピー/ムーブ代入不可。
2) 値の代入。 store ( desired ) と等価。

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 の値でアトミックに置き換えます。これは、基盤となる std::weak_ptr<T> である p に対して p.swap(desired) を実行するのと同様です。メモリは order に従って順序付けられます。 order std::memory_order_consume std::memory_order_acquire 、または std::memory_order_acq_rel の場合、動作は未定義です。

atomic<weak_ptr<T>>:: load

基となる 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 ;

load() と等価です。

atomic<weak_ptr<T>>:: exchange

基となる std:: weak_ptr < T > desired でアトミックに置き換え、 p. swap ( desired ) を実行したかのように動作する。ここで p は基となる std:: weak_ptr < T > であり、交換直前に p が保持していた値のコピーを返す。メモリ順序は order に従う。これはアトミックなread-modify-write操作である。

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)
1) 基となる std:: weak_ptr < T > expected と同じポインタ値を格納しており、それと所有権を共有している場合、または基となる std:: weak_ptr < T > 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 に対するアトミックなread-modify-write操作であり、 expected はアトミック更新後にアクセスされない。失敗時、この操作は * this に対するアトミックなload操作であり、 expected はアトミックオブジェクトから読み取られた既存の値で更新される。 expected のuse_countに対するこの更新はこのアトミック操作の一部であるが、書き込み自体(およびそれに続く解放/破棄)は必須ではない。
2) (1) と同様ですが、偽の失敗が発生する可能性もあります。
3) 次と等価: return compare_exchange_strong ( expected, desired, order, fail_order ) ; 。ただし fail_order order と同じであるが、 std::memory_order_acq_rel std::memory_order_acquire に置き換えられ、 std::memory_order_release std::memory_order_relaxed に置き換えられる。
4) 次と等価: return compare_exchange_weak ( expected, desired, order, fail_order ) ; 。ただし fail_order order と同じだが、 std::memory_order_acq_rel std::memory_order_acquire に置き換えられ、 std::memory_order_release std::memory_order_relaxed に置き換えられる。

atomic<weak_ptr<T>>:: wait

void wait ( std:: weak_ptr < T > old
std:: memory_order order = std:: memory_order_seq_cst ) const noexcept ;

アトミックな待機操作を実行します。

load ( order ) old を比較し、それらが等価である場合、 notify_one() または notify_all() によって * this が通知されるまでブロックします。これは load ( order ) が変化するまで繰り返されます。この関数は、基盤となる実装が偽の解除を行った場合でも、値が変化した場合にのみ返ることが保証されています。

メモリは order に従って順序付けられます。 order std::memory_order_release または std::memory_order_acq_rel の場合、動作は未定義です。

注記: 2つの std::weak_ptr は、同じポインタを格納しており、かつ所有権を共有しているか、両方が空である場合に等価となります。

atomic<weak_ptr<T>>:: notify_one

void notify_one ( ) noexcept ;

アトミックな通知操作を実行します。

* this に対するアトミック待機操作(すなわち wait() )でブロックされているスレッドが存在する場合、少なくとも1つのそのようなスレッドのブロックを解除します。それ以外の場合は何も行いません。

atomic<weak_ptr<T>>:: notify_all

void notify_all ( ) noexcept ;

アトミックな通知操作を実行します。

* this に対するアトミック待機操作(すなわち wait() )でブロックされているスレッドがある場合、それらすべてのブロックを解除します。そうでない場合は何も行いません。

メンバー定数

唯一の標準 std::atomic メンバー定数 is_always_lock_free もこの特殊化によって提供されます。

atomic<weak_ptr<T>>:: is_always_lock_free

static constexpr bool is_always_lock_free = /*implementation-defined*/ ;

関連項目

(C++11)
bool型、整数型、 浮動小数点型、 (C++20以降) およびポインタ型に対するatomicクラステンプレートと特殊化
(クラステンプレート)