2012-01-23 24 views
5

Estoy un poco confundido acerca de la orden de limpieza cuando usa PThreads con respecto a la cancelación. Normalmente, si el hilo está desacoplado, se limpia automáticamente cuando termina. Si no está separado, debe unirse a él para reclamar los recursos del sistema.¿Necesitas unirte a un hilo cancelado? (pthreads)

El libro de texto que estoy estados lectura de la siguiente manera extraña, que suena como unión es opcional en relación con la cancelación:

"Si lo que necesita saber cuando el hilo en realidad ha terminado, debe unirse con ella llamando a pthread_join después de cancelarlo ".

Entonces, ¿necesito unirme a un hilo cancelado para liberar sus recursos? Si no, ¿por qué?

Respuesta

6

TLPI dice esto:

Al recibir una solicitud de cancelación, un hilo cuyo cancelability se habilitado y diferida termina cuando se alcanza un próximo punto de cancelación. Si el hilo no se separó, se debe unir a otro hilo en el proceso para que evite que se convierta en un hilo zombie.

Además, como la cancelación de un hilo generalmente no se realiza de inmediato (lea más sobre "puntos de cancelación") sin unirse, no puede estar seguro de que el hilo haya sido cancelado.

+0

¿Se convertiría en un hilo zombie si se hubiera configurado en modo separado antes de ser cancelado? o debería hacer una nueva pregunta: p –

+0

@ w00te Depende de usted. Pero la cita dice "* si el hilo no se separó *". Si suelta un hilo, no hay necesidad (** ni forma **) de unirlo. Una vez que separe un hilo, no hay forma de volver a unirlo. – cnicutar

+0

El estándar de Posix no habla de hilos de zombies, pero si entiendo el término correctamente, un hilo que se ha separado nunca se convertirá en un zombi. (Lógicamente, separar un hilo tiene el mismo efecto que decirle al sistema que se una por usted, tan pronto como termine). –

3

De man pthread_join:

Después de un hilo cancelado ha terminado, una combinación con ese hilo usando pthread_join (3) obtiene PTHREAD_CANCELED como estado de salida del hilo. (La unión con un hilo es la única manera de saber que la cancelación ha completado .)

Parece que la adhesión no es necesario para su ejecución es necesario si se quiere saber lo que hiciste realmente tener éxito.

1

De Doccumentation de pthread_cancel():

Después de un hilo cancelado ha terminado, una combinación con ese hilo usando pthread_join (3) obtiene PTHREAD_CANCELED como estado de salida del hilo. (Unirse a un hilo es la única forma de saber que la cancelación se ha completado).

+0

Entiendo eso, pero mi pregunta es: si no me importa obtener la confirmación de cancelación, ¿todavía necesito llamar a pthread_join, o es este algún tipo de caso especial donde los recursos ya han sido liberado y es opcional (que es lo que suena en la cita que anoté) –

+0

@ w00te: No creo que sea necesario en ese caso. –

+0

@Als Es. Estás confundiendo la cancelación con separación. No tiene que unirse a un hilo aislado, de hecho, es un error hacerlo. Sin embargo, a menos que el hilo se haya separado, debe hacer un join o separarlo. –

0

Si algo sale mal en un hilo o se detiene de alguna manera, siempre será arreglado por el sistema operativo. Entonces todo es lindo y seguro.

Solo necesita unir el hilo si debe asegurarse de que realmente ha dejado de ejecutarse, como fusionar dos tareas paralelas. (P.ej.si tiene varios hilos trabajando en varias partes una estructura dividida necesita unirlos todos, en espera hasta que estén todos terminados, cuando quiera combinar la estructura nuevamente)

+0

Esto es falso. A menos que se haya desconectado un hilo, el sistema debe mantenerlo hasta que se una, para que la unión funcione. Esto requiere recursos, lo que significa que si lo hace sistemáticamente, eventualmente se quedará sin recursos. –

1

Un hilo usando pthread puede tener los siguientes estados de cancelación :

 
PTHREAD_CANCEL_ENABLE 
PTHREAD_CANCEL_DISABLE 

Si intenta cancelar un hilo que no se sabe si el 100% del hilo conseguirá realmente cancelado. El uso de una combinación le proporciona la información si el hilo fue realmente cancelado o no. También hay cancelar tipos que deben ser considerados y funciones pthread respectivas para establecer el tipo y el estado Cancelar:

 
int pthread_setcancelstate (int state, int *oldstate); 
int pthread_setcanceltype (int type, int *oldtype); 

Aquí es un código de ejemplo tomado de http://www.ijon.de/comp/tutorials/threads/cancel.html

EDIT: O soy demasiado tonto para publicar unos pocos las líneas de código o el formateador realmente me molestan hoy. Simplemente busque el código en el enlace de arriba, por favor.

+0

+1 para la muestra :) –