2011-06-15 13 views
6
 pthread_create(&thread, NULL, AcceptLoop, (void *)this); 

He declarado así y dentro de la función AcceptLoop tengo infinity while loop. Me gustaría cerrar este hilo cuando el servidor está cerrado. He leído pthread_cancel y pthread_join, pero no estoy seguro de cuál es mejor y más seguro. Me gustaría escuchar algunas instrucciones detalladas o tutoriales. Gracias por adelantado.¿Cómo cierro un hilo de forma segura?

Respuesta

1

Creo que le gustaría salir del subproceso de trabajo mediante la señalización desde el hilo principal.

Dentro de AcceptLoop en lugar de iterar infinitamente en un estado, puede establecer la condición a través de su hilo principal. Deberá usar alguna sincronización para esta variable. Una vez que la variable se establece desde el hilo principal, la cadena de trabajo AcceptLoop se abrirá y podrá llamar al pthread_exit.

si le gustaría que su hilo principal para esperar hilo hijo para salir puede utilizar pthread_join para hacerlo.

En general, un hilo hijo puede salir en tres condiciones:

  1. llamando pthread_exit.
  2. llamando pthread_cancel.
  3. La función de hilo retorna.
2

Usted no tiene que hacer nada, sólo que volvía de la función del hilo terminará el hilo limpiamente. Alternativamente, puede llamar al pthread_exit(), pero prefiero regresar. pthread_cancel() es aterrador y complicado/difícil de conseguir. Mantente claro si es posible. pthread_join() es más necesario si desea saber cuándo acabados de hilo y está interesado en el valor return.

Lamentablemente, estoy equivocado. Ha pasado un tiempo. Para que lo que dije sea verdad, debes desapegarte de tu hilo. De lo contrario tendrá que llamar pthread_join:

De cualquier pthread_join (3) o pthread_detach() debe ser llamado para cada hilo que crea una aplicación, para que los recursos del sistema para el hilo pueden ser liberados . (Sin embargo, tenga en cuenta que los recursos de todos los temas son liberados cuando el proceso termina .)

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_detach.3.html

+2

Todo esto depende de si el mensaje ha sido separado. Si no lo ha hecho, necesitará pthread_se unir al hilo para limpiar la memoria de subprocesos. Si se ha desconectado, entonces sí regresa de la función principal o pthread_exit(). – Suroot

+0

@Suroot eres 100% correcto, edité mi respuesta para reflejar. –

Cuestiones relacionadas