Namespaces
Variants

std:: atomic_... <std::shared_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 >
bool atomic_is_lock_free ( const std:: shared_ptr < T > * p ) ;
(1) (C++11以降)
(C++20で非推奨)
(C++26で削除)
template < class T >
std:: shared_ptr < T > atomic_load ( const std:: shared_ptr < T > * p ) ;
(2) (C++11で追加)
(C++20で非推奨)
(C++26で削除)
template < class T >

std:: shared_ptr < T > atomic_load_explicit

( const std:: shared_ptr < T > * p, std:: memory_order mo ) ;
(3) (C++11で追加)
(C++20で非推奨)
(C++26で削除予定)
template < class T >
void atomic_store ( std:: shared_ptr < T > * p, std:: shared_ptr < T > r ) ;
(4) (C++11で追加)
(C++20で非推奨)
(C++26で削除予定)
template < class T >

void atomic_store_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > r,

std:: memory_order mo ) ;
(5) (C++11以降)
(C++20で非推奨)
(C++26で削除)
template < class T >

std:: shared_ptr < T > atomic_exchange

( std:: shared_ptr < T > * p, std:: shared_ptr < T > r ) ;
(6) (C++11以降)
(C++20で非推奨)
(C++26で削除)
template < class T >

std:: shared_ptr < T > atomic_exchange_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > r,

std:: memory_order mo ) ;
(7) (C++11以降)
(C++20で非推奨)
(C++26で削除)
template < class T >

bool atomic_compare_exchange_weak
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,

std:: shared_ptr < T > desired ) ;
(8) (C++11以降)
(C++20で非推奨)
(C++26で削除)
template < class T >

bool atomic_compare_exchange_strong
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,

std:: shared_ptr < T > desired ) ;
(9) (C++11以降)
(C++20で非推奨)
(C++26で削除)
template < class T >

bool atomic_compare_exchange_strong_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,
std:: shared_ptr < T > desired,

std:: memory_order success, std:: memory_order failure ) ;
(10) (C++11以降)
(C++20で非推奨)
(C++26で削除)
template < class T >

bool atomic_compare_exchange_weak_explicit
( std:: shared_ptr < T > * p, std:: shared_ptr < T > * expected,
std:: shared_ptr < T > desired,

std:: memory_order success, std:: memory_order failure ) ;
(11) (C++11で導入)
(C++20で非推奨)
(C++26で削除)

同期なしで同じ std::shared_ptr オブジェクトに複数の実行スレッドがアクセスし、そのいずれかのアクセスが shared_ptr の非constメンバ関数を使用する場合、データ競合が発生します。ただし、すべてのそのようなアクセスが対応するアトミックアクセス関数( std::atomic_load std::atomic_store など)のオーバーロードであるこれらの関数を通じて実行される場合は除きます。

shared_ptr の制御ブロックはスレッドセーフであることに注意してください:異なる std::shared_ptr オブジェクトは、変更操作(例えば operator = reset など)を使用して、複数のスレッドによって同時にアクセスすることが可能です。これは、これらのインスタンスがコピーであり、内部的に同じ制御ブロックを共有している場合でも同様です。

1) p によって指される共有ポインタへのアトミックアクセスがロックフリーであるかどうかを判定します。
2) 次と等価: atomic_load_explicit ( p, std:: memory_order_seq_cst )
3) p が指すshared pointerを返します。
非特殊化された std::atomic_load_explicit と同様に、 mo std:: memory_order_release または std:: memory_order_acq_rel の場合、動作は未定義です。
4) 次と等価: atomic_store_explicit ( p, r, std:: memory_order_seq_cst )
5) 共有ポインタ r を、 p が指す共有ポインタにアトミックに格納する。 as if によって p - > swap ( r ) のように。
非特殊化された std::atomic_store_explicit と同様に、 mo std:: memory_order_acquire または std:: memory_order_acq_rel の場合、動作は未定義です。
6) 次と等価: atomic_exchange_explicit ( p, r, std:: memory_order_seq_cst )
7) 共有ポインタ r p が指す共有ポインタに格納し、 p が以前指していた値をアトミックに返します。 as if によって p - > swap ( r ) が実行されたかのように動作し、交換後の r のコピーを返します。
8) 次と同等
atomic_compare_exchange_weak_explicit
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst )
.
9) 次と同等
atomic_compare_exchange_strong_explicit
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst )
.
10,11) p expected が指すshared_ptrを比較する。
  • 等価である場合(同じポインタ値を格納し、同じオブジェクトの所有権を共有しているか、両方とも空である場合)、 success で指定されたメモリ順序制約を使用して * p desired を代入し、 true を返す。
  • 等価でない場合、 failure で指定されたメモリ順序制約を使用して * expected * p を代入し、 false を返す。
atomic_compare_exchange_weak_explicit は偽の失敗を起こす可能性があります。
expectedがヌルポインタである場合、または expected failure std:: memory_order_release または std:: memory_order_acq_rel が指定されている場合、動作は未定義です。

p がヌルポインタの場合、これらの関数の動作はすべて未定義です。

目次

変更点: - 「Contents」を「目次」に翻訳 - C++関連の専門用語(Parameters、Exceptions、Return value、Notes、Example、Defect reports、See also)は原文のまま保持 - HTMLタグ、属性、構造は完全に保持 - 番号付けと書式は変更なし

パラメータ

p, expected - std::shared_ptr へのポインタ
r, desired - std::shared_ptr
mo, success, failure - std::memory_order 型のメモリ順序指定子

例外

これらの関数は例外をスローしません。

戻り値

1) true ロックフリー命令を使用してアトミックアクセスが実装されている場合。
2,3) 指し示された共有ポインタのコピー。
4,5) (なし)
6,7) 以前に指し示されていた共有ポインタのコピー。
8-11) true 共有ポインタが等価であり交換が実行された場合は、 false それ以外の場合。

注記

これらの関数は通常、ミューテックスを使用して実装され、ポインタ値をキーとして使用するグローバルハッシュテーブルに格納されます。

Concurrency TS は、これらの関数の使用に代わるものとして、アトミックスマートポインタクラス atomic_shared_ptr および atomic_weak_ptr を提供します。

これらの関数は以下の特殊化を推奨して非推奨となりました: std::atomic テンプレート: std:: atomic < std:: shared_ptr > および std:: atomic < std:: weak_ptr >

(C++20以降)
(C++26まで)

これらの関数は以下の特殊化を推奨して削除されました: std::atomic テンプレート: std:: atomic < std:: shared_ptr < および std:: atomic < std:: weak_ptr >

(C++26以降)

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2172 C++11 expected がヌルポインタになる可能性があった この場合の動作は未定義
LWG 2980 C++11 空の shared_ptr は常に等価ではなかった 同じポインタ値を格納している場合は等価

関連項目

アトミック型の操作がロックフリーかどうかをチェックする
(関数テンプレート)
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換える
(関数テンプレート)
アトミックオブジェクトに格納された値をアトミックに取得する
(関数テンプレート)
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換え、アトミックオブジェクトの古い値を返す
(関数テンプレート)
アトミックオブジェクトの値を非アトミックな引数とアトミックに比較し、等しい場合はアトミック交換を、等しくない場合はアトミックロードを実行する
(関数テンプレート)