std::atomic_...<std::shared_ptr>
| ヘッダ <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 |
(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 |
(5) | (C++11以降) (C++20で非推奨) (C++26で削除) |
| template< class T > std::shared_ptr<T> atomic_exchange |
(6) | (C++11以降) (C++20で非推奨) (C++26で削除) |
| template< class T > std::shared_ptr<T> atomic_exchange_explicit |
(7) | (C++11以降) (C++20で非推奨) (C++26で削除) |
| template< class T > bool atomic_compare_exchange_weak |
(8) | (C++11以降) (C++20で非推奨) (C++26で削除) |
| template< class T > bool atomic_compare_exchange_strong |
(9) | (C++11以降) (C++20で非推奨) (C++26で削除) |
| template< class T > bool atomic_compare_exchange_strong_explicit |
(10) | (C++11以降) (C++20で非推奨) (C++26で削除) |
| template< class T > bool atomic_compare_exchange_weak_explicit |
(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 などの可変操作を使用して、複数のスレッドによって同時にアクセスできます。
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst)。
(p, expected, desired, std::memory_order_seq_cst,
std::memory_order_seq_cst)。
- もしそれらが同等である場合(同じポインタ値を格納しており、同じオブジェクトの所有権を共有しているか、両方とも空である場合)、success で指定されたメモリ順序制約を使用して desired を *p に代入し、true を返します。
- もしそれらが同等でない場合、failure で指定されたメモリ順序制約を使用して *p を *expected に代入し、false を返します。
atomic_compare_exchange_weak_explicit は意図しない失敗をする可能性があります。p がヌルポインタの場合、これらの関数の動作はすべて未定義です。
目次 |
[編集] パラメータ
| p, expected | - | std::shared_ptr へのポインタ |
| r, desired | - | std::shared_ptr |
| mo, success, failure | - | std::memory_order 型のメモリ順序セレクタ |
[編集] 例外
これらの関数は例外を投げません。
[編集] 戻り値
[編集] 備考
これらの関数は通常、ポインタ値をキーとして使用するグローバルハッシュテーブルに格納されたミューテックスを使用して実装されます。
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 は決して同等ではなかった |
同じポインタ値を格納していれば同等 |
[編集] 関連項目
| (C++11) |
アトミック型の操作がロックフリーであるかを確認する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換える (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトに格納されている値をアトミックに取得する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換え、アトミックオブジェクトの古い値を返す (関数テンプレート) |
| アトミックオブジェクトの値と非アトミックな引数をアトミックに比較し、等しければアトミック交換を、そうでなければアトミックロードを実行する (関数テンプレート) |