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 ?
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.
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 usandopthread_kill()
y espere su terminación conpthread_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 conpthread_join()
. Este enfoque requiere el uso detallado depthread_cleanup_push()
ypthread_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.
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).
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()
.
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.
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