Orden de destrucción del hilo principal y el uso de pthread_key_create
-
28-10-2019 - |
Pregunta
Me preguntaba sobre el uso de pthread_key_create
mientras pasa en una función de destructor.
Quería tener algo como esto:
static ComplexObject foo;
void workoncomplex(void *) {
foo.dosomestuff();
}
static pthread_key_t pthreadkey;
void function_called_by_threads() {
pthread_key_create(&pthreadkey, workoncomplex)
}
Obviamente, he dejado de lado una buena cantidad de detalles.
Para cualquier hilo que no sea el hilo principal, esto obviamente está bien (bloqueo de bloqueo, etc.), y cada vez que un hilo muere, mi workoncomplex
la función se llama y manipula el foo
objeto.
Mi pregunta es, ¿es esto válido para el hilo principal, como obviamente el pthreadkey
El llamado del destructor ocurre en el hilo enrurde, pero ¿está garantizado que se ejecutará antes de que se destruyan las estadísticas? Si es así, ¿tendría que verificar si estoy en el hilo principal y volver de inmediato? ¿O puedo tratar todos los hilos de la misma manera y asumir que mis objetos estáticos seguirán presentes?
Solución
La función destructora no se llama a la salida de la aplicación. Solo se llama cuando sale un hilo.
Si sale del hilo principal con pthread_exit()
entonces se llamará a la función del destructor, pero la aplicación aún no se está cerrando, por lo que es seguro usar el static
variables.
Si llamas exit()
o regresar de main()
entonces no se llamará a la función destructora, por lo que el hecho de que el static
Las variables se destruyen no es un problema. Usar atexit()
para asegurarse de que su función de destructor se convierta en regreso de main()
o en una llamada de exit()
.