2012-05-13 8 views
5

Estoy trabajando en un proyecto en el que tengo un hilo principal y un hilo daemon para realizar salidas de archivo. En mi hilo principal tengo un campo pthread_t * _daemon que me gustaría eliminar, pero obviamente solo después de _daemon devuelve NULL (entiendo que usar pthread_exit() causa pérdidas de memoria).Eliminando un hilo daemon solo después de que devuelve

¿Cómo puedo hacerlo sin ocupado? ¿Espera? Si trato de usar una variable de condición, tengo un problema: cuando llamo al signal() formulario _daemon para activar mi hilo principal, borra _daemon antes de que _daemon devuelva NULL.

Lo que hice fue simplemente usar un bloqueo mutex que está bloqueado cuando se lanza y desbloquea el programa antes de que _daemon regrese. ¿Hay alguna manera mejor que no cause una espera ocupada?

+1

'pthread_join'? – Mat

+0

No está claro lo que estás preguntando. ¿Qué es exactamente lo que le gustaría eliminar? –

+0

El campo pthread_t, pero solo después de que el hilo del daemon almacenado allí devuelve – yotamoo

Respuesta

5

pthread_detach() hace lo que estás buscando. Parece que va a resolver su problema (sin fugas) con mucha menos complejidad.

Para que pueda llamar sin problemas al pthread_detatch(_daemon) cuando haya terminado con el otro subproceso, sin tener que preocuparse por si el subproceso en sí todavía se está ejecutando. Hace no finaliza el hilo, en su lugar causa que el hilo se limpie cuando termina.

De la documentación:

La función pthread_detach() indicará a la aplicación que el almacenamiento para el hilo de rosca se puede reclamar cuando el thread termina. Si el hilo no ha terminado, pthread_detach() no deberá hacer que termine.

En realidad se puede crear un hilo en el estado separado para empezar estableciendo attr de:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

apropiadamente en la creación de tiempo. La página de manual pthread_create() dice:

Cuando un hilo separado termina, sus recursos son liberados automáticamente a el sistema. [snip] Hacer que un subproceso se separe es útil para algunos tipos de subprocesos cuyo estado de salida no necesita preocuparse por la aplicación. Por predeterminado, se crea un nuevo subproceso en un estado que se puede unir, a menos que attr se haya establecido en cree el subproceso en un estado separado (usando pthread_attr_setdetachstate (3)).

+0

Pero _deamon que quiero liberar está en el hilo principal, no en el hilo daemon. Quiero eliminar este campo solo después de que el hilo daemon termine – yotamoo

+2

@yotamoo: Se puede eliminar un objeto 'pthread_t' antes de que el hilo asociado con él retorne o se realice de otra manera. El hilo en sí no se basa en el objeto 'pthread_t' - eliminar el objeto' pthread_t' no destruye el hilo asociado. Pero es posible que deba llamar a 'pthread_detach()' para que el sistema sepa que puede limpiar todos los recursos de subprocesos cuando el subproceso retorna o sale. –

+0

¿Qué significa exactamente "eliminar un objeto pthread_t"? – alk

1

pthread_t es un unsigned long int, así que no veo la necesidad de hacer un puntero de pthread_t (se puede también utilizar su dirección en pthread funciones), pero si usted insiste, entonces usted puede eliminarla después creando un pthread (pero entonces no tendrá forma de comunicarse con él, porque es un número de subproceso creado, utilizado para unir, separar funciones, etc.).

Cuestiones relacionadas