std::atomic<T>:: wait
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
|
atomic::wait
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
| Constants | ||||
|
(C++17)
|
||||
| Specialized member functions | ||||
|
Specialized for integral,
floating-point (C++20) and pointer types |
||||
|
Specialized for integral and
pointer types only |
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Specialized for integral types only | ||||
|
void
wait
(
T old,
std::
memory_order
order
=
std:: memory_order_seq_cst ) const noexcept ; |
(1) |
(desde C++20)
(constexpr desde C++26) |
|
void
wait
(
T old,
std::
memory_order
order
=
|
(2) | (desde C++20) |
Realiza operaciones de espera atómicas. Se comporta como si repitiera los siguientes pasos:
-
Compara la
representación de valor
de
this
-
>
load
(
order
)
con la de
old
.
- Si son iguales, entonces se bloquea hasta que * this sea notificado por notify_one() o notify_all() , o el hilo se desbloquee espuriamente.
- De lo contrario, retorna.
Estas funciones están garantizadas para retornar solo si el valor ha cambiado, incluso si la implementación subyacente se desbloquea espuriamente.
Si order no es std:: memory_order_relaxed , std:: memory_order_consume , std:: memory_order_acquire o std:: memory_order_seq_cst , el comportamiento es indefinido.
Contenidos |
Parámetros
| old | - |
el valor a verificar que el objeto
atomic
ya no contiene
|
| order | - | restricciones de orden de memoria a aplicar |
Notas
Esta forma de detección de cambios suele ser más eficiente que el sondeo simple o los bloqueos de giro puros.
Debido al problema ABA , los cambios transitorios de old a otro valor y de vuelta a old podrían pasar desapercibidos y no desbloquearse.
La comparación es bit a bit (similar a std::memcmp ); no se utiliza ningún operador de comparación. Los bits de relleno que nunca participan en la representación del valor de un objeto son ignorados.
Ejemplo
#include <atomic> #include <chrono> #include <future> #include <iostream> #include <thread> using namespace std::literals; int main() { std::atomic<bool> all_tasks_completed{false}; std::atomic<unsigned> completion_count{}; std::future<void> task_futures[16]; std::atomic<unsigned> outstanding_task_count{16}; // Generar varias tareas que toman diferentes cantidades de // tiempo, luego decrementar el contador de tareas pendientes. for (std::future<void>& task_future : task_futures) task_future = std::async([&] { // Esta pausa representa hacer trabajo real... std::this_thread::sleep_for(50ms); ++completion_count; --outstanding_task_count; // Cuando el contador de tareas cae a cero, notificar // al esperador (hilo principal en este caso). if (outstanding_task_count.load() == 0) { all_tasks_completed = true; all_tasks_completed.notify_one(); } }); all_tasks_completed.wait(false); std::cout << "Tasks completed = " << completion_count.load() << '\n'; }
Salida:
Tasks completed = 16
Véase también
|
(C++20)
|
notifica al menos un hilo esperando en el objeto atómico
(función miembro pública) |
|
(C++20)
|
notifica todos los hilos bloqueados esperando en el objeto atómico
(función miembro pública) |
|
(C++20)
|
notifica un hilo bloqueado en atomic_wait
(plantilla de función) |
|
(C++20)
|
notifica todos los hilos bloqueados en atomic_wait
(plantilla de función) |