Namespaces
Variants

std::atomic<T>:: wait

From cppreference.net

Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
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 =

std:: memory_order_seq_cst ) const volatile noexcept ;
(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)
notifica un hilo bloqueado en atomic_wait
(plantilla de función)
notifica todos los hilos bloqueados en atomic_wait
(plantilla de función)