std::atomic_fetch_sub, std::atomic_fetch_sub_explicit
| Definiert in Header <atomic> |
||
| template< class T > T atomic_fetch_sub( std::atomic<T>* obj, |
(1) | (seit C++11) |
| template< class T > T atomic_fetch_sub( volatile std::atomic<T>* obj, |
(2) | (seit C++11) |
| template< class T > T atomic_fetch_sub_explicit( std::atomic<T>* obj, |
(3) | (seit C++11) |
| template< class T > T atomic_fetch_sub_explicit( volatile std::atomic<T>* obj, |
(4) | (seit C++11) |
Führt eine atomare Subtraktion durch. Subtrahiert arg atomar von dem Wert, auf den obj zeigt, und gibt den zuvor von obj gehaltenen Wert zurück. Die Operation wird so ausgeführt, als ob Folgendes ausgeführt worden wäre:
Wenn std::atomic<T> kein fetch_sub-Mitglied hat (dieses Mitglied wird nur für Ganzzahltypen, Gleitkommatypen(seit C++20) und Zeigertypen außer bool bereitgestellt), ist das Programm ill-formed.
Inhalt |
[bearbeiten] Parameter
| obj | - | Zeiger auf das zu modifizierende atomare Objekt |
| arg | - | der Wert, der vom Wert im atomaren Objekt subtrahiert werden soll |
| Reihenfolge | - | die Speicher-Synchronisationsreihenfolge |
[bearbeiten] Rückgabewert
Der Wert, der den Effekten dieser Funktion in der Modifikationsreihenfolge von *obj unmittelbar vorausging.
[bearbeiten] Beispiel
Mehrere Threads können std::atomic_fetch_sub verwenden, um einen indizierten Container gleichzeitig zu verarbeiten.
#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(); }
Ausgabe
reader 2 processed item 50 reader 1 processed item 44 reader 4 processed item 46 <....> reader 0 done reader 4 done reader 3 done
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P0558R1 | C++11 | exakter Typabgleich war erforderlich, weilT aus mehreren Argumenten abgeleitet wurde |
T wird nur abgeleitetvon obj |
[bearbeiten] Siehe auch
| subtrahiert atomar das Argument vom Wert, der im atomaren Objekt gespeichert ist, und erhält den zuvor gehaltenen Wert (öffentliche Memberfunktion von std::atomic<T>) | |
| (C++11)(C++11) |
addiert einen nicht-atomaren Wert zu einem atomaren Objekt und gibt den vorherigen Wert des atomaren Objekts zurück (Funktions-Template) |