std::experimental::atomic_shared_ptr<T>:: compare_exchange_strong, std::experimental::atomic_shared_ptr<T>:: compare_exchange_weak
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(1) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(2) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(3) | |
|
bool
compare_exchange_weak
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(4) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(5) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(5) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order success, std:: memory_order failure ) noexcept ; |
(6) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(7) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
const
std::
shared_ptr
<
T
>
&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(7) | |
|
bool
compare_exchange_strong
(
std::
shared_ptr
<
T
>
&
expected,
std::
shared_ptr
<
T
>
&&
desired,
std:: memory_order order = std:: memory_order_seq_cst ) noexcept ; |
(8) | |
基にある
shared_ptr
を
*
this
と
expected
で原子的に比較し、等価である場合、前者を
desired
で置き換えます(読み込み-修正-書き込み操作を実行)。そうでない場合、
*
this
に格納されている実際の値を
expected
に読み込みます(読み込み操作を実行)。置き換えは、
shared_ptr
のコピー代入演算子またはムーブ代入演算子によって適切に行われるかのように実行されます。
2つの
shared_ptr
は、同じポインタ値を格納し、所有権を共有する場合にのみ等価です。
読み込み-変更-書き込み操作と読み込み操作のメモリモデルは、それぞれ success および failure です。オーバーロード (3,4,7,8) の場合、 order は読み込み-変更-書き込み操作と読み込み操作の両方に使用されます。ただし、 order == std:: memory_order_acq_rel の場合、または order == std:: memory_order_release の場合、それぞれ std::memory_order_acquire および std::memory_order_relaxed が読み込み操作に使用されます。
弱いバージョン (1-4) は偽の失敗を起こす可能性があります。
目次 |
パラメータ
| expected | - | アトミックオブジェクト内で見つかると期待される値への参照 |
| desired | - | 期待値と一致した場合にアトミックオブジェクトに格納する値 |
| success | - | 比較が成功した場合の読み込み-変更-書き込み操作のメモリ同期順序。すべての値が許可される |
| failure | - | 比較が失敗した場合のロード操作のメモリ同期順序。 std::memory_order_release または std::memory_order_acq_rel にはできず、 success よりも強い順序付けを指定できない |
| order | - | 両方の操作に対するメモリ同期順序 |
戻り値
true 基盤となるアトミック値が変更された場合、 false それ以外の場合。
備考
atomic_shared_ptr
オブジェクト自体へのすべての変更、および関連するすべての
use_count
のインクリメントは、アトミックに実行されることが保証されています。関連する
use_count
のデクリメントはアトミック操作の後に発生しますが、その操作の一部である必要はありません。関連する破棄または解放操作はすべて、アトミック操作の後に発生し、その操作の一部ではありません。
compare-exchange操作が
true
を返す場合、
expected
はアトミック更新ステップの後にアクセスされません。操作が
false
を返す場合、
expected
はアトミック更新の試行において
atomic_shared_ptr
オブジェクトから読み取られた既存の値で更新されます。
expected
への書き込みに対応する
use_count
の更新はアトミック操作の一部ですが、
expected
自体への書き込みはアトミック操作の一部である必要はありません。
オーバーロード (1,3,5,7) では、 desired はアトミック更新ステップの後にアクセスされません。
オーバーロード (2,4,6,8) の場合、 desired は、比較交換操作が true を返した場合にのみムーブされる。このムーブはアトミックな更新ステップの後に行われる。
注記
弱い形式 (1-4) の関数は、偽の失敗を起こすことが許可されています。つまり、 * this と expected が実際には等価である場合でも、等価でないかのように動作することがあります。compare-and-exchange操作がループ内で行われる場合、弱いバージョンは一部のプラットフォームでより優れたパフォーマンスを発揮します。
関連項目
std::shared_ptr
に対するアトミック操作を特殊化
(関数テンプレート) |