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)uobject->load(order)con el deold.- Si son iguales bit a bit, entonces se bloquea hasta que se notifique a
*objectpor std::atomic::notify_one() o std::atomic::notify_all(), o el hilo se desbloquee de manera espuria. - De lo contrario, regresa.
- Si son iguales bit a bit, entonces se bloquea hasta que se notifique a
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
| Esta sección está incompleta Razón: sin ejemplo |
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)
|
(C++20) |
Notifica a todos los hilos/subprocesos bloqueados esperando al objeto atómico. (función miembro pública de std::atomic)
|
(C++20) |
Notifica a un hilo bloqueado en atomic_wait. (plantilla de función) |
(C++20) |
Notifica a todos los hilos bloqueados en atomic_wait. (plantilla de función) |