Espacios de nombres
Variantes

std::atomic_wait, std::atomic_wait_explicit

De cppreference.com
 
 
 
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx20 "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx20 "> </tbody><tbody> </tbody>
Definido en el archivo de encabezado <atomic>
(1) (desde C++20)
template< class T > void atomic_wait( const std::atomic<T>* object, typename std::atomic<T>::value_type old ) noexcept;
template< class T > void atomic_wait( const volatile std::atomic<T>* object, typename std::atomic<T>::value_type old ) noexcept;
(2) (desde C++20)
template< class T > void atomic_wait_explicit( const std::atomic<T>* object, typename std::atomic<T>::value_type old, std::memory_order order ) noexcept;
template< class T > void atomic_wait_explicit( const volatile std::atomic<T>* object, typename std::atomic<T>::value_type old, std::memory_order order ) noexcept;

Realiza operaciones de espera atómicas. Se comporta como si realizara repetidamente los siguientes pasos:

  • Compara la representación de valor de object->load(std::memory_order_seq_cst) u object->load(order) con el de old.
    • Si son iguales bit a bit, entonces se bloquea hasta que se notifique a *object por std::atomic::notify_one() o std::atomic::notify_all(), o el hilo se desbloquee de manera espuria.
    • De lo contrario, regresa.

Se garantiza que estas funciones regresarán solo si el valor ha cambiado, incluso si la implementación subyacente se desbloquea de manera espuria.

1) Equivalente a object->wait(old, std::memory_order_seq_cst).
2) Equivalente a object->wait(old, order).

Parámetros

object - Un puntero al objeto atómico a verificar y en el cual esperar.
old - El valor a verificar que el objeto atómico ya no contenga.
order - El ordenamiento de sincronización de memoria para esta operación no debe ser std::memory_order::release o std::memory_order::acq_rel

Valor de retorno

(Ninguno)

Notas

Esta forma de detección de cambios suele ser más eficaz que el simple sondeo o los spinlocks puros.

Debido al problema ABA, los cambios transitorios de old a otro valor y de nuevo a old pueden perderse y no desbloquearse.

La comparación es bit a bit (similar a std::memcpy); no se utiliza ningún operador de comparación. Se ignoran los bits de relleno que nunca participan en la representación del valor de un objeto.

Ejemplo

Véase también

Notifica al menos a un hilo/subproceso esperando al objeto atómico.
(función miembro pública de std::atomic) [editar]
Notifica a todos los hilos/subprocesos bloqueados esperando al objeto atómico.
(función miembro pública de std::atomic) [editar]
Notifica a un hilo bloqueado en atomic_wait.
(plantilla de función) [editar]
Notifica a todos los hilos bloqueados en atomic_wait.
(plantilla de función) [editar]