Namespaces
Variants

std:: notify_all_at_thread_exit

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
notify_all_at_thread_exit
(C++11)
(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
Definido en el encabezado <condition_variable>
void notify_all_at_thread_exit ( std:: condition_variable & cond,
std:: unique_lock < std:: mutex > lk ) ;
(desde C++11)

notify_all_at_thread_exit proporciona un mecanismo para notificar a otros hilos que un hilo determinado ha finalizado completamente, incluyendo la destrucción de todos los objetos thread_local . Opera de la siguiente manera:

  • La propiedad del bloqueo previamente adquirido lk es transferida al almacenamiento interno.
  • El entorno de ejecución se modifica de tal manera que cuando el hilo actual finaliza, la variable de condición cond es notificada como si fuera mediante lk. unlock ( ) ;
    cond. notify_all ( ) ;
    .

El desbloqueo implícito lk. unlock ( ) está secuenciado después de la destrucción de todos los objetos con duración de almacenamiento local del hilo asociados con el hilo actual.

Si se satisface cualquiera de las siguientes condiciones, el comportamiento es indefinido:

  • lk no está bloqueado por el hilo que realiza la llamada.
  • Si otros hilos también están esperando en cond , lk. mutex ( ) es diferente del mutex desbloqueado por las funciones de espera ( wait , wait_for y wait_until ) llamadas en cond por esos hilos.

Contenidos

Notas

Un efecto equivalente puede lograrse con las facilidades proporcionadas por std::promise o std::packaged_task .

El candel suministrado lk se mantiene hasta que el hilo finalice. Una vez que se ha llamado a esta función, ningún hilo adicional puede adquirir el mismo candel para esperar en cond . Si algunos hilos están esperando en esta variable de condición, asegúrese de que la condición por la que se espera se cumple mientras se mantiene el candel sobre lk , y que este candel no se libera y se readquiere antes de llamar a notify_all_at_thread_exit para evitar confusiones por despertamientos espurios en otros hilos.

En casos de uso típicos, esta función es lo último que llama un hilo separado.

Parámetros

cond - la variable de condición a notificar al salir del hilo
lk - el bloqueo asociado con la variable de condición cond

Valor de retorno

(ninguno)

Ejemplo

Este fragmento de código parcial ilustra cómo notify_all_at_thread_exit puede utilizarse para evitar acceder a datos que dependen de variables locales de hilo mientras esas variables locales de hilo están en proceso de ser destruidas:

#include <cassert>
#include <condition_variable>
#include <mutex>
#include <string>
#include <thread>
std::mutex m;
std::condition_variable cv;
bool ready = false;
std::string result; // some arbitrary type
void thread_func()
{
    thread_local std::string thread_local_data = "42";
    std::unique_lock<std::mutex> lk(m);
    // assign a value to result using thread_local data
    result = thread_local_data;
    ready = true;
    std::notify_all_at_thread_exit(cv, std::move(lk));
}   // 1. destroy thread_locals;
    // 2. unlock mutex;
    // 3. notify cv.
int main()
{
    std::thread t(thread_func);
    t.detach();
    // do other work
    // ...
    // wait for the detached thread
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{ return ready; });
    // result is ready and thread_local destructors have finished, no UB
    assert(result == "42");
}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2140 C++11 la llamada a notify_all_at_thread_exit
sincronizada con llamadas a funciones esperando en cond
actualizado el requisito de
sincronización

Véase también

establece el resultado a un valor específico mientras entrega la notificación solo al finalizar el hilo
(función miembro pública de std::promise<R> )
ejecuta la función asegurando que el resultado esté listo solo cuando el hilo actual finalice
(función miembro pública de std::packaged_task<R(Args...)> )