std:: atomic_fetch_sub, std:: atomic_fetch_sub_explicit
|
ヘッダーで定義
<atomic>
|
||
|
template
<
class
T
>
T atomic_fetch_sub
(
std::
atomic
<
T
>
*
obj,
|
(1) | (C++11以降) |
|
template
<
class
T
>
T atomic_fetch_sub
(
volatile
std::
atomic
<
T
>
*
obj,
|
(2) | (C++11以降) |
|
template
<
class
T
>
T atomic_fetch_sub_explicit
(
std::
atomic
<
T
>
*
obj,
|
(3) | (C++11以降) |
|
template
<
class
T
>
T atomic_fetch_sub_explicit
(
volatile
std::
atomic
<
T
>
*
obj,
|
(4) | (C++11以降) |
アトミック減算を実行します。 arg を obj が指す値からアトミックに減算し、 obj が以前保持していた値を返します。この操作は以下のコードが実行されたかのように行われます:
std::atomic<T>
に
fetch_sub
メンバーが存在しない場合(このメンバーは
整数型
、
浮動小数点型
(C++20以降)
および
ポインタ型
に対してのみ提供されます、
bool
を除く)、プログラムは不適格となります。
目次 |
パラメータ
| obj | - | 変更対象のアトミックオブジェクトへのポインタ |
| arg | - | アトミックオブジェクトに格納されている値から減算する値 |
| order | - | メモリ同期順序 |
戻り値
この関数の効果が適用される直前の値、 変更順序 における * obj の値。
例
複数のスレッドが
std::atomic_fetch_sub
を使用して、インデックス付きコンテナを並行処理できます。
#include <atomic> #include <iostream> #include <numeric> #include <string> #include <thread> #include <vector> const int N = 50; std::atomic<int> cnt; std::vector<int> data(N); void reader(int id) { for (;;) { int idx = atomic_fetch_sub_explicit(&cnt, 1, std::memory_order_relaxed); if (idx >= 0) std::cout << "reader " << std::to_string(id) << " processed item " << std::to_string(data[idx]) << '\n'; else { std::cout << "reader " << std::to_string(id) << " done\n"; break; } } } int main() { std::iota(data.begin(), data.end(), 1); cnt = data.size() - 1; std::vector<std::thread> v; for (int n = 0; n < 5; ++n) v.emplace_back(reader, n); for (auto& t : v) t.join(); }
出力:
reader 2 processed item 50 reader 1 processed item 44 reader 4 processed item 46 <....> reader 0 done reader 4 done reader 3 done
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P0558R1 | C++11 |
厳密な型一致が要求されていた
T
が複数の引数から推論されていたため
|
T
は
obj からのみ推論される |
関連項目
|
アトミックオブジェクトに格納された値から引数を減算し、以前に保持されていた値を取得する
(
std::atomic<T>
の公開メンバ関数)
|
|
|
(C++11)
(C++11)
|
非アトミック値をアトミックオブジェクトに加算し、アトミックの以前の値を取得する
(関数テンプレート) |
|
Cドキュメント
for
atomic_fetch_sub
,
atomic_fetch_sub_explicit
|
|