Uso pthread_create(&thread1, &attrs, //... , //...);
y necesito si se produce alguna condición para matar a este hilo ¿cómo matarlo?Kill Thread in Pthread Library
Respuesta
Primera tienda el ID del tema
pthread_create(&thr, ...)
luego llamar
pthread_cancel(thr)
Sin embargo, esto no es una práctica recomendada de programación! 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.
Eche un vistazo a la función pthread_kill()
.
Esto no elimina ningún hilo, simplemente le envía una señal. – alk
Estoy de acuerdo con Antti, la 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).
Existen dos enfoques para este problema.
- utilizar una señal: El hilo se instala un controlador de señal usando
sigaction()
que establece un indicador, y el hilo comprueba periódicamente la bandera para ver si debe terminar. Cuando el hilo debe terminar, emita la señal usandopthread_kill()
y espere su terminació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; - Utilice un punto de cancelación: el hilo finaliza cada vez 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 se ha desprendido el hilo usando pthread_detach()
, no se puede unir de nuevo utilizando pthread_join()
.)
Ambos enfoques pueden ser muy complicado, pero bien podría ser especialmente útil en una situación dada.
pthread_exit(0)
Esto matará el hilo.
- 1. PThread vs boost :: thread?
- 2. UserControls in Class Library
- 3. QApplication in Non-Main Thread
- 4. C# Threading.Suspend in Obsolete, thread was obsoleto?
- 5. C# Kill todas las discusiones
- 6. ¿Qué es g ++ 's -pthread equiv in clang?
- 7. pthread (fallo de segmentación)
- 8. pthread en una clase
- 9. Boost thread Leakage C++
- 10. cerrar/kill transacción
- 11. Kill a python process
- 12. Gancho Emacsclient en kill
- 13. Thread sleep y thread join
- 14. Kill a niño colgado proceso
- 15. Thread Pool vs Thread Spawning
- 16. Thread ID vs. Thread Handle
- 17. std :: thread detect principal thread
- 18. Cómo crear pthread variables específicas sin __thread
- 19. ¿Cómo funciona "kill -QUIT process_id"?
- 20. funciones pthread "_np" sufijo
- 21. Usando pthread en C++
- 22. ¿Cómo funciona pthread?
- 23. Tracing pthread scheduling
- 24. autoconf con -pthread
- 25. conceptos pthread en Linux
- 26. pthread sleep linux
- 27. -XX: OnOutOfMemoryError = "kill -9% p" Problema
- 28. unordered_map thread safety
- 29. Cómo enlazar C-k a kill-region si la región se seleccionó; else kill-line
- 30. no compila si incluye boost/thread en Linux Ubuntu:) 10.10
El problema con pthread_cancel, btw, es que si lo usa, entonces el código que se ejecuta en el hilo que se cancela debe comprender los puntos de cancelación y asegurarse de que (a) golpee uno con la frecuencia suficiente como para que se cancele en buena tiempo, y (b) no pierde recursos cuando esto sucede. Esto es un poco complicado, mientras que si usas un mensaje, es muy explícito en tu código exactamente cuando el hilo puede salir. –
@Steve: Desafortunadamente, 'pthread_cancel' es la única forma limpia * en el código de la biblioteca * para interrumpir un hilo que podría estar bloqueado en un syscall. El otro método es instalar un manejador de señal de interrupción y asegurarse de que todo su código esté preparado para manejar 'EINTR', pero el código de la biblioteca no puede suponer que tiene derecho a cambiar el manejo de señal o imponer el manejo 'EINTR' a la persona que llama. –