¿Cómo termino un hilo en C++ 11?
No necesito terminar el hilo correctamente ni hacer que responda a un comando de "terminar". Estoy interesado en terminar el hilo con fuerza usando C++ 11 puro.
Puedes llamar
std::terminate()
desde cualquier hilo y el hilo al que te refieres finalizará forzosamente.Podrías disponer que
~thread()
se ejecute en el objeto del hilo de destino, sin que intervengajoin()
nidetach()
en ese objeto. Esto tendrá el mismo efecto que la opción 1.Podría diseñar una excepción que tenga un destructor que arroje una excepción. Y luego haga arreglos para que el hilo de destino lance esta excepción cuando deba terminarse por la fuerza. La parte complicada en este caso es lograr que el hilo de destino lance esta excepción.
Las opciones 1 y 2 no filtran recursos dentro del proceso, pero terminan todos los subprocesos.
La opción 3 probablemente perderá recursos, pero es parcialmente cooperativa en el sentido de que el hilo de destino debe aceptar lanzar la excepción.
No existe una forma portátil en C++ 11 (que yo sepa) de eliminar de forma no cooperativa un solo subproceso en un programa de múltiples subprocesos (es decir, sin eliminar todos los subprocesos). No había ninguna motivación para diseñar tal característica.
A std::thread
puede tener esta función miembro:
native_handle_type native_handle();
Es posible que pueda utilizar esto para llamar a una función dependiente del sistema operativo para que haga lo que desee. Por ejemplo, en los sistemas operativos de Apple, esta función existe y native_handle_type
es un archivo pthread_t
. Si tiene éxito, es probable que pierda recursos.
La respuesta de @Howard Hinnant es correcta y completa. Pero podría malinterpretarse si se lee demasiado rápido, porque std::terminate()
(todo el proceso) tiene el mismo nombre que la "terminación" que @Alexander V tenía en mente (1 hilo).
Resumen: "terminar 1 subproceso + con fuerza (el subproceso de destino no coopera) + C++11 puro = De ninguna manera".
Supongo que el hilo que hay que eliminar está en algún tipo de modo de espera o haciendo algún trabajo pesado. Sugeriría utilizar una forma "ingenua".
Defina algún valor booleano global:
std::atomic_bool stop_thread_1 = false;
Coloque el siguiente código (o similar) en varios puntos clave, de manera que haga que todas las funciones en la pila de llamadas regresen hasta que el hilo finalice naturalmente:
if (stop_thread_1)
return;
Luego, para detener el hilo de otro hilo (principal):
stop_thread_1 = true;
thread1.join ();
stop_thread_1 = false; //(for next time. this can be when starting the thread instead)