¿Cómo termino un hilo en C++ 11?

Resuelto Alexander V asked hace 12 años • 8 respuestas

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.

Alexander V avatar Aug 31 '12 08:08 Alexander V
Aceptado
  1. Puedes llamar std::terminate()desde cualquier hilo y el hilo al que te refieres finalizará forzosamente.

  2. Podrías disponer que ~thread()se ejecute en el objeto del hilo de destino, sin que intervenga join()ni detach()en ese objeto. Esto tendrá el mismo efecto que la opción 1.

  3. 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::threadpuede 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_typees un archivo pthread_t. Si tiene éxito, es probable que pierda recursos.

Howard Hinnant avatar Aug 31 '2012 01:08 Howard Hinnant

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".

Nanno Langstraat avatar Dec 12 '2013 14:12 Nanno Langstraat

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)
Doron Ben-Ari avatar May 27 '2019 14:05 Doron Ben-Ari