Espacios de nombres
Variantes
Acciones

std::notify_all_at_thread_exit

De cppreference.com
< cpp‎ | thread
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
Gestión genérica de bloqueo
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
notify_all_at_thread_exit
(C++11)
(C++11)
Semáforos
Pestillos y barreras
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
(C++11)
Recuperación segura
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
Definido en el archivo de 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 dado ha finalizado por completo, incluida la destrucción de todos los objetos thread_local. Funciona de la siguiente manera:

  • La posesión del cerrojo adquirido anteriormente lk se transfiere al almacenamiento interno.
  • El entorno de ejecución se modifica de modo que cuando el hilo actual termina, a la variable de condición cond se le notifica como si:

lk.unlock();
cond.notify_all();

La operación lk.unlock implícita está secuenciada-después (como se define en std::memory_order) de la destrucción de todos los objetos con duración de almacenamiento local al hilo asociados con el hilo actual.

Un efecto equivalente puede conseguirse con los servicios proporcionados por std::promise o std::packaged_task.

Contenido

[editar]Notas

Llamar a esta función si lock.mutex() no está bloqueado por el hilo actual resulta en un comportamiento no definido.

Llamar a esta función si lock.mutex() no es el mismo mutex que el utilizado por todos los demás hilos que actualmente están esperando en la misma variable de condición resulta en un comportamiento no definido.

El cerrojo proporcionado por lk se mantiene bloqueado hasta que el hilo termina. Una vez que se ha llamado a esta función, no más hilos pueden tomar posesión del mismo cerrojo para esperar en cond. Si algún hilo está esperando en esta variable de condición, no debe intentar liberar y volver a tomar posesión del cerrojo cuando se despierte de forma falsa (spuriously).

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

[editar]Parámetros

cond - La variable de condición a notificar cuando el hilo termina.
lk - El cerrojo asociado con la variable de condición cond.

[editar]Valor de retorno

(Ninguno)

[editar]Ejemplo

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

#include <mutex>#include <thread>#include <condition_variable>   #include <cassert>#include <string>   std::mutex m;std::condition_variable cv;   bool ready =false;std::string result;// algún tipo arbitrario   void thread_func(){ thread_local std::string thread_local_data ="42";   std::unique_lock<std::mutex> lk(m);   // asigna un valor al resultado usando datos thread_local result = thread_local_data; ready =true;   std::notify_all_at_thread_exit(cv, std::move(lk));   }// 1. destruir variables thread_local;// 2. desbloquear mutex;// 3. notificar a cv.   int main(){std::thread t(thread_func); t.detach();   // hacer otro trabajo// ...   // espera el hilo separadostd::unique_lock<std::mutex> lk(m); cv.wait(lk, []{return ready;});   // el resultado está listo y los destructores// locales al hilo han terminado, no hay comportamiento indefinidoassert(result =="42");}


[editar]Véase también

Establece el resultado a un valor específico mientras notifica solamente cuando el hilo termina.
(función miembro pública de std::promise)[editar]
Ejecuta la función asegurándose de que el resultado esté listo solo una vez que el hilo actual termine.
(función miembro pública de std::packaged_task)[editar]
close