std:: atomic <std::weak_ptr>
|
ヘッダーで定義
<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) | |
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
の値でアトミックに置き換えます。これは、基盤となる
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
>
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
;
|
||
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.
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) | |
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に対するこの更新はこのアトミック操作の一部であるが、書き込み自体(およびそれに続く解放/破棄)は必須ではない。
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
に置き換えられる。
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クラステンプレートと特殊化
(クラステンプレート) |