std::atomic_exchange, std::atomic_exchange_explicit
De cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx11 ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx11 ">
</tbody><tbody>
</tbody>
| Definido en el archivo de encabezado <atomic>
|
||
| (1) | (desde C++11) | |
template< class T > T atomic_exchange( std::atomic<T>* obj, typename std::atomic<T>::value_type desr ) noexcept; |
||
template< class T > T atomic_exchange( volatile std::atomic<T>* obj, typename std::atomic<T>::value_type desr ) noexcept; |
||
| (2) | (desde C++11) | |
template< class T > T atomic_exchange_explicit( std::atomic<T>* obj, typename std::atomic<T>::value_type desr, std::memory_order order ) noexcept; |
||
template< class T > T atomic_exchange_explicit( volatile std::atomic<T>* obj, typename std::atomic<T>::value_type desr, std::memory_order order ) noexcept; |
||
1) Reemplaza atómicamente el valor al que apunta
obj con el valor de desr y devuelve el valor que obj tenía previamente, como si fuera por obj->exchange(desr).2) Reemplaza atómicamente el valor al que apunta
obj con el valor de desr y devuelve el valor que obj tenía previamente, como si fuera por obj->exchange(desr, order).Parámetros
| obj | - | Puntero al objeto atómico a modificar. |
| desr | - | El valor a almacenar en el objeto atómico. |
| order | - | El orden de sincronización de la memoria para esta operación: todos los valores están permitidos. |
Valor de retorno
El valor que tenía previamente el objeto atómico al que apunta obj.
Ejemplo
Se puede implementar un mutex de espín en el espacio de usuarios usando una operación de intercambio atómica, similar a std::atomic_flag_test_and_set:
Ejecuta este código
#include <thread>
#include <vector>
#include <iostream>
#include <atomic>
std::atomic<bool> lock(false); // alberga true cuando está bloqueado
// alberga false cuando está desbloqueado
void f(int n)
{
for (int cnt = 0; cnt < 100; ++cnt) {
while(std::atomic_exchange_explicit(&lock, true, std::memory_order_acquire))
; // espín hasta adquirir
std::cout << "Salida del hilo " << n << '\n';
std::atomic_store_explicit(&lock, false, std::memory_order_release);
}
}
int main()
{
std::vector<std::thread> v;
for (int n = 0; n < 10; ++n) {
v.emplace_back(f, n);
}
for (auto& t : v) {
t.join();
}
}
Salida:
Salida del hilo 2
Salida del hilo 6
Salida del hilo 7
...<exactamente 1000 líneas>...
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 Tse deduce de varios argumentos. |
T se deduce únicamente del argumento atomic.
|
Véase también
(C++11) |
automáticamente reemplazado el valor del objeto atómico y obtiene el valor que tenía antes Original: atomically replaced the value of 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)
|
| Compara atómicamente el valor del objeto atómico con el argumento no atómico y realiza un intercambio atómico si son iguales o una carga atómica si no lo son. (plantilla de función) |
| Especializa las operaciones atómicas para std::shared_ptr. (plantilla de función) | |
Documentación de C para atomic_exchange, atomic_exchange_explicit
| |