std::atomic_fetch_sub, std::atomic_fetch_sub_explicit
![]() | This page has been machine-translated from the English version of the wiki using Google Translate. The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
definiert in Header <atomic> | ||
template<class Integral > Integral atomic_fetch_sub(std::atomic<Integral>* obj, Integral arg ); | (1) | (seit C++11) |
template<class Integral > Integral atomic_fetch_sub(volatilestd::atomic<Integral>* obj, Integral arg ); | (2) | (seit C++11) |
template<class Integral > Integral atomic_fetch_sub_explicit(std::atomic<Integral>* obj, Integral arg, | (3) | (seit C++11) |
template<class Integral > Integral atomic_fetch_sub_explicit(volatilestd::atomic<Integral>* obj, Integral arg, | (4) | (seit C++11) |
template<class T > T* atomic_fetch_sub(std::atomic<T*>* obj, std::ptrdiff_t arg ); | (5) | (seit C++11) |
template<class T > T* atomic_fetch_sub(volatilestd::atomic<T*>* obj, std::ptrdiff_t arg ); | (6) | (seit C++11) |
template<class T > T* atomic_fetch_sub_explicit(std::atomic<T*>* obj, std::ptrdiff_t arg, | (7) | (seit C++11) |
template<class T > T* atomic_fetch_sub_explicit(volatilestd::atomic<T*>* obj, std::ptrdiff_t arg, | (8) | (seit C++11) |
1-2) Atomically subtracts arg
from the value pointed to by obj
and returns the value obj
held previously, as if by obj->fetch_sub(arg)
3-4) Atomically subtracts arg
from the value pointed to by obj
and returns the value obj
held previously, as if by obj->fetch_sub(arg, order)
5-6) Atomically decrements the pointer value, pointed to by obj
, by arg
, and returns the value obj
held previously, as if by obj->fetch_sub(arg)
7-8) Atomically decrements the pointer value, pointed to by obj
, by arg
, and returns the value obj
held previously, as if by obj->fetch_sub(arg, order)
Inhaltsverzeichnis |
[Bearbeiten]Parameter
obj | - | Zeiger auf den atomaren Objekts zu ändern Original: pointer to the atomic object to modify The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
arg | - | der Wert von dem Wert im atomaren Objekt gespeichert subtrahieren Original: the value to subtract from the value stored in the atomic object The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
order | - | der Speicher sycnhronization Bestellung für diesen Vorgang: Alle Werte sind zulässig . Original: the memory sycnhronization ordering for this operation: all values are permitted. The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
[Bearbeiten]Rückgabewert
obj
obj
You can help to correct and verify the translation. Click here for instructions.
[Bearbeiten]Ausnahmen
[Bearbeiten]Mögliche Implementierung
First version |
---|
template<class T >typenamestd::enable_if<std::is_integral<T>::value&&!std::is_same<T, bool>::value, T>::type atomic_fetch_sub(std::atomic<T>* obj, T arg );{return obj->fetch_sub(arg);} |
Second version |
template<class T > T* atomic_fetch_sub(std::atomic<T*>* obj, std::ptrdiff_t arg){return obj->fetch_sub(arg);} |
[Bearbeiten]Beispiel
Multiple threads may use fetch_sub
to concurrently process an indexed container
#include <string>#include <thread>#include <vector>#include <iostream>#include <atomic>#include <numeric> constint N =10000;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 <10;++n){ v.emplace_back(reader, n);}for(auto& t : v){ t.join();}}
Output:
reader 2 processed item 10000 reader 6 processed item 9994 reader 4 processed item 9996 reader 6 processed item 9992 <....> reader 0 done reader 5 done reader 3 done reader 9 done
[Bearbeiten]Siehe auch
(C++11) | atomar zieht das Argument aus dem Wert in der atomaren Objekt gespeichert und erhält den Wert zuvor gehaltenen Original: atomically subtracts the argument from the value stored in the atomic object and obtains the value held previously The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (öffentliche Elementfunktion of std::atomic ) |
(C++11) (C++11) | fügt eine nicht-elementare Wert einem atomaren Objekt und erhält den vorherigen Wert des atomaren Original: adds a non-atomic value to an atomic object and obtains the previous value of the atomic The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (Funktions-Template) |
C documentation for atomic_fetch_sub, atomic_fetch_sub_explicit |