2010-11-19 16 views

Respuesta

7

Sí, esto es posible. De hecho, esta posibilidad es una de las razones principales por las que existe pthread_detach(). A partir de la documentación de POSIX de pthread_detach() (véase man pthread_detach):

It has been suggested that a "detach" function is not necessary; the 
    detachstate thread creation attribute is sufficient, since a thread 
    need never be dynamically detached. However, need arises in at least 
    two cases: 

    1. In a cancellation handler for a pthread_join() it is nearly essen- 
     tial to have a pthread_detach() function in order to detach the 
     thread on which pthread_join() was waiting. Without it, it would 
     be necessary to have the handler do another pthread_join() to 
     attempt to detach the thread, which would both delay the cancella- 
     tion processing for an unbounded period and introduce a new call 
     to pthread_join(), which might itself need a cancellation handler. 
     A dynamic detach is nearly essential in this case. 


    2. In order to detach the "initial thread" (as may be desirable in 
     processes that set up server threads). 

Así que lo que estás proponiendo está bien de acuerdo con las normas.

Editar: sólo para confirmar que aún más, los POSIX description of exec() estados:

El hilo inicial en la nueva imagen del proceso serán acoplable, como si se crea con el atributo detachstate establecido en PTHREAD_CREATE_JOINABLE.

+0

¿Consideraría agregar un enlace a su fuente para la última edición? Creo que lo obtuviste aquí: http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html, pero antes quería confirmarlo. ¡Gran respuesta, sin embargo! – currysensei

+1

@currysensei: ¡Agregado! – psmears

0

No puedo imaginar por qué podría hacer esto en una aplicación en el mundo real (por favor alguien comentar un ejemplo si se puede pensar en uno), pero no creo que incluso es posible. Todas las búsquedas sobre pthreads que he visto siempre hacen que se llame a la unión desde el hilo principal, no a un hilo secundario.

El unen también requiere que el hilo que está intentando unirse a se crea con la bandera PTHREAD_CREATE_JOINABLE. No he podido encontrar ninguna documentación que indique si el hilo principal se creó o no como tal.

CodeGuru tiene una pregunta similar sobre el mismo here que puede o no puede ayudar a aclararlo.

Si lo que desea lograr es que el subproceso secundario continúe después de que el subproceso principal haya salido, debe crear el subproceso secundario separado, o use fork/vfork, según la plataforma en la que se encuentre.

+0

'PTHREAD_CREATE_JOINABLE' es el valor predeterminado según POSIX; no necesita usar 'pthread_attr_t' para obtenerlo. –

+0

Por cierto, estoy de acuerdo en que probablemente esta no sea una buena práctica. Formulé la pregunta desde el punto de vista de si una implementación debe soportar este uso dudoso, no si un escritor de la aplicación debería usarla. :-) –

0

Su enfoque parece válido en cuanto a mí, en particular, ya que está haciendo el pthread_exit al final de main.

Por otro lado, no encontré ninguna indicación en POSIX, ya sea que el hilo inicial de main se pueda unir o no. La razón de ser en respuesta psmears' sólo pide que main debe ser desmontable de donde se crea que puede unirse.

también algo más malicioso podría llamar pthread_detach de una subrutina llamada por el principal más o menos. Por lo tanto, debe verificar definitivamente el valor de retorno de pthread_join para verificar si hay algún caso así.

También en el código de ejemplo que tiene una carrera entre la creación de start y la terminación de main:

  • main podría terminarse antes de start llega a pthread_join

Mutexing el acceso a la mt variable debe capure eso.

+0

Si 'pthread_detach' ya ha sido llamado en un hilo, el resultado de llamar' pthread_join' en ese hilo no está definido; no necesita devolver ningún error, y de hecho podría colapsar si el hilo ya ha finalizado y sus recursos fueron desasignados. –

+0

Suponiendo que el hilo principal se puede unir, no hay problema si 'main' llama' pthread_exit' antes de 'start' llama a' pthread_join'. La semántica de un hilo que se puede unir es como la de un 'pid' para un proceso secundario. Al igual que el 'pid' está reservado (proceso zombie) hasta que lo espere y recopile su estado de salida, el' pthread_t' es válido hasta que separe o se una al hilo, incluso si ya ha salido. –

+0

No estoy de acuerdo con su primera observación. Un hilo que no se puede unir es detectable y no conduce a un resultado indefinido. 'La función pthread_join() fallará si: * EINVAL * La implementación ha detectado que el valor especificado por el hilo no se refiere a un hilo que se puede unir. –

Cuestiones relacionadas