2010-01-18 13 views

Respuesta

50

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.

+4

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

+11

@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. –

2

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

+2

Esto no elimina ningún hilo, simplemente le envía una señal. – alk

5

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

18

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 usando pthread_kill() y espere su terminación con pthread_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 con pthread_join(). Este enfoque requiere un uso detallado de pthread_cleanup_push() y pthread_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.

0
pthread_exit(0) 

Esto matará el hilo.