Matar hilo en Pthread Biblioteca


Uso pthread_create(&thread1, &attrs, //... , //...); y necesito si alguna condición ocurrió necesidad de matar a este hilo cómo matar a este ?

Author: Sajad Bahmani, 2010-01-18

5 answers

Primero almacena el id del hilo

pthread_create(&thr, ...)

Luego llama

pthread_cancel(thr)

Sin embargo, esto no es una práctica de programación recomendada! Es mejor usar un mecanismo de comunicación entre hilos como semáforos o mensajes para comunicar al hilo que debe detener la ejecución.

Tenga en cuenta que pthread_kill(...) no termina realmente el hilo de recepción, sino que entrega una señal a él, y depende de la señal y de los manejadores de señal lo que sucede.

 51
Author: Antti Huima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 09:03:36

Hay dos enfoques para este problema.

  • Use una señal : El subproceso instala un manejador de señal usando sigaction() que establece una bandera, y el subproceso comprueba periódicamente la bandera para ver si debe terminar. Cuando el subproceso debe terminar, emita la señal usando pthread_kill() y espere su terminación con pthread_join(). Este enfoque requiere una sincronización previa entre el subproceso padre y el subproceso hijo, para garantizar que el subproceso hijo ya esté instalado el manejador de señales antes de que sea capaz de manejar la señal de terminación;
  • Use un punto de cancelación : El subproceso termina cada vez que se ejecuta una función de cancelación. Cuando el subproceso debe terminar, ejecute pthread_cancel() y espere su terminación con pthread_join(). Este enfoque requiere el uso detallado de pthread_cleanup_push() y pthread_cleanup_pop() para evitar la fuga de recursos. Estas dos últimas llamadas pueden interferir con el ámbito léxico del código (ya que pueden ser macros que producen { y } tokens) y son muy difícil de mantener correctamente.

(Ten en cuenta que si ya has separado el hilo usando pthread_detach(), no puedes volver a unirlo usando pthread_join().)

Ambos enfoques pueden ser muy complicados, pero cualquiera de ellos podría ser especialmente útil en una situación dada.

 18
Author: alecov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-02 23:59:41

Estoy de acuerdo con Antti, la mejor práctica sería implementar algunos puntos de control(s) donde el hilo comprueba si debe terminar. Estos puntos de control se pueden implementar de varias maneras, por ejemplo: una variable compartida con bloqueo o un evento que el subproceso comprueba si está configurado (el subproceso puede optar por esperar tiempo cero).

 5
Author: Fredrik Jansson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 09:06:43

Echa un vistazo a la función pthread_kill().

 2
Author: Wyzard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 09:01:55
pthread_exit(0) 

Esto matará el hilo.

 0
Author: Anand Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-02 09:47:08