close
Espacios de nombres
Variantes

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:

#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 T
se 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) [editar]
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) [editar]
Especializa las operaciones atómicas para std::shared_ptr.
(plantilla de función)
Documentación de C para atomic_exchange, atomic_exchange_explicit