Espacios de nombres
Variantes
Acciones

std::atomic_wait, std::atomic_wait_explicit

De cppreference.com
< cpp‎ | atomic
 
 
 
Definido en el archivo de encabezado <atomic>
(1)(desde C++20)
template<class T >

void atomic_wait(conststd::atomic<T>* object,

                  typenamestd::atomic<T>::value_type old )noexcept;
template<class T >

void atomic_wait(constvolatilestd::atomic<T>* object,

                  typenamestd::atomic<T>::value_type old )noexcept;
(2)(desde C++20)
template<class T >

void atomic_wait_explicit(conststd::atomic<T>* object,
                           typenamestd::atomic<T>::value_type old,

                           std::memory_order order )noexcept;
template<class T >

void atomic_wait_explicit(constvolatilestd::atomic<T>* object,
                           typenamestd::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).

Contenido

[editar]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

[editar]Valor de retorno

(Ninguno)

[editar]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.

[editar]Ejemplo

[editar]Véase también

(C++20)
Notifica al menos a un hilo/subproceso esperando al objeto atómico.
(función miembro pública de std::atomic)[editar]
(C++20)
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]
close