c++ - pthread_kill - pthread_cancel
Kill Thread in Pthread Library (5)
Eche un vistazo a la función pthread_kill()
.
Yo uso pthread_create(&thread1, &attrs, //... , //...);
y necesita si alguna condición ocurrió necesita matar este hilo cómo matar esto?
Estoy de acuerdo con Antti, una mejor práctica sería implementar algunos puntos de control 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 hilo comprueba si está configurado (el hilo puede optar por esperar el tiempo cero).
Hay dos enfoques para este problema.
- Use una señal : el hilo instala un manejador de señal usando
sigaction()
que establece un indicador, y el hilo revisa periódicamente el indicador para ver si debe terminar. Cuando el hilo deba terminar, emita la señal usandopthread_kill()
y espere su finalización conpthread_join()
. Este enfoque requiere sincronización previa entre el subproceso principal y el subproceso secundario, para garantizar que el subproceso secundario ya haya instalado el manejador de señal antes de que sea capaz de manejar la señal de terminación; - Use un punto de cancelación : el hilo termina siempre que se ejecuta una función de cancelación. Cuando el hilo debe terminar, ejecute
pthread_cancel()
y espere su finalización conpthread_join()
. Este enfoque requiere un uso detallado depthread_cleanup_push()
ypthread_cleanup_pop()
para evitar la fuga de recursos. Estas dos últimas llamadas pueden interferir con el alcance léxico del código (ya que pueden ser macros que producen{
y}
tokens) y son muy difíciles de mantener adecuadamente.
(Tenga en cuenta que si ya ha desconectado el hilo usando pthread_detach()
, no puede unirlo nuevamente utilizando pthread_join()
.
Ambos enfoques pueden ser muy difíciles, pero o bien pueden ser especialmente útiles en una situación dada.
Primero almacene el ID del hilo
pthread_create(&thr, ...)
luego llamar
pthread_cancel(thr)
Sin embargo, ¡esta 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 (...) en realidad no termina el hilo de recepción, sino que le envía una señal, y depende de la señal y de los manejadores de señal lo que sucede.
pthread_exit(0)
Esto matará el hilo.