名前空間
変種
操作

std::atomic_...<std::shared_ptr>

From cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
 
ヘッダ <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_loadstd::atomic_storeなど)のオーバーロードであるこれらの関数を介して実行されない限り、データ競合が発生します。

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

1) p が指す共有ポインタへのアトミックアクセスがロックフリーであるかどうかを決定します。
2) atomic_load_explicit(p, std::memory_order_seq_cst) と同等です。
3) p が指す共有ポインタを返します。
非特殊化された std::atomic_load_explicit と同様に、mostd::memory_order_release または std::memory_order_acq_rel の場合、動作は未定義です。
4) atomic_store_explicit(p, r, std::memory_order_seq_cst) と同等です。
5) 共有ポインタ rp が指す共有ポインタにアトミックに格納します。あたかも p->swap(r) によって行われたかのようです。
非特殊化された std::atomic_store_explicit と同様に、mostd::memory_order_acquire または std::memory_order_acq_rel の場合、動作は未定義です。
6) atomic_exchange_explicit(p, r, std::memory_order_seq_cst) と同等です。
7) 共有ポインタ rp が指す共有ポインタに格納し、以前 p が指していた値をアトミックに返します。あたかも 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) pexpected が指す共有ポインタを比較します。
  • もしそれらが同等である場合(同じポインタ値を格納しており、同じオブジェクトの所有権を共有しているか、両方とも空である場合)、success で指定されたメモリ順序制約を使用して desired*p に代入し、true を返します。
  • もしそれらが同等でない場合、failure で指定されたメモリ順序制約を使用して *p*expected に代入し、false を返します。
atomic_compare_exchange_weak_explicit は意図しない失敗をする可能性があります。
expected がヌルポインタである場合、または failurestd::memory_order_release または std::memory_order_acq_rel の場合、動作は未定義です。

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

目次

[編集] パラメータ

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 は決して同等ではなかった 同じポインタ値を格納していれば同等

[編集] 関連項目

アトミック型の操作がロックフリーであるかを確認する
(関数テンプレート) [編集]
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換える
(関数テンプレート) [編集]
アトミックオブジェクトに格納されている値をアトミックに取得する
(関数テンプレート) [編集]
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換え、アトミックオブジェクトの古い値を返す
(関数テンプレート) [編集]
アトミックオブジェクトの値と非アトミックな引数をアトミックに比較し、等しければアトミック交換を、そうでなければアトミックロードを実行する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)