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 pthreadkeyEl 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?

¿Fue útil?

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().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top