std::atomic_fetch_sub, std::atomic_fetch_sub_explicit
Definido en el archivo de encabezado <atomic> | ||
(1) | ||
template<class T > T atomic_fetch_sub(std::atomic<T>* obj, | ||
template<class T > T atomic_fetch_sub(volatilestd::atomic<T>* obj, | ||
(2) | ||
template<class T > T atomic_fetch_sub_explicit(std::atomic<T>* obj, | ||
template<class T > T atomic_fetch_sub_explicit(volatilestd::atomic<T>* obj, | ||
Realiza una resta atómica. Atómicamente resta arg
del valor al que apunta obj
y devuelve el valor que obj
tenía previamente. La operación se realiza como si se ejecutara lo siguiente:
Contenido |
[editar]Parámetros
obj | - | Puntero al objeto atómico a modificar. |
arg | - | El valor a restar del valor almacenado en el objeto atómico. |
order | - | El orden de sincronización de la memoria para esta operación: todos los valores están permitidos. |
[editar]Valor de retorno
El valor que precede inmediatamente a los efectos de esta función en el orden de modificación de *obj
.
[editar]Posible implementación
template<class T > T atomic_fetch_sub(std::atomic<T>* obj, typenamestd::atomic<T>::difference_type arg )noexcept{return obj->fetch_sub(arg);} |
[editar]Ejemplo
Varios hilos pueden usar fetch_sub
para procesar concurrentemente un contenedor indexado.
#include <string>#include <thread>#include <vector>#include <iostream>#include <atomic>#include <numeric> constint N =50;std::atomic<int> cnt;std::vector<int> data(N); void lector(int id){for(;;){int idx = atomic_fetch_sub_explicit(&cnt, 1, std::memory_order_relaxed);if(idx >=0){std::cout<<"lector "<<std::to_string(id)<<" ha procesado elemento "<<std::to_string(data[idx])<<'\n';}else{std::cout<<"lector "<<std::to_string(id)<<" listo\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(lector, n);}for(auto& t : v){ t.join();}}
Salida:
lector 2 ha procesado elemento 50 lector 1 ha procesado elemento 44 lector 4 ha procesado elemento 46 <....> lector 0 listo lector 4 listo lector 3 listo
[editar]Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
P0558R1 | C++11 | Se requiere una coincidencia de tipo exacta porque T se deduce de varios argumentos. | T se deduce únicamente del argumento atomic . |
[editar]Véase también
(C++11) | atómicamente resta el argumento de que el valor almacenado en el objeto atómico y obtiene el valor que tenía antes 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. (función miembro pública de std::atomic ) |
(C++11)(C++11) | Agrega un valor no atómico a un objeto atómico y obtiene el valor anterior del objeto atómico. (plantilla de función) |
Documentación de C para atomic_fetch_sub, atomic_fetch_sub_explicit |