2012-08-09 9 views
15

Tengo un problema sobre el hilo principal y otro hilo en el mismo proceso. Cuando la función principal regresa, ¿el otro hilo sale también? Tengo algunos me confunden. Y escribo algunos código de prueba, como este:salida del hilo principal, ¿hay otra salida también?

void* test1(void *arg) 
{ 
    unsigned int i = 0; 
    while (1){ 
     i+=1; 
    } 
    return NULL; 
} 

void* test2(void *arg) 
{ 
    long double i = 1.0; 
    while (1){ 
     i *= 1.1; 
    } 
    return NULL; 
} 

void startThread (void * (*run)(void*), void *arg) { 
    pthread_t t; 
    pthread_attr_t attr; 
    if (pthread_attr_init(&attr) != 0 
     || pthread_create(&t, &attr, run, arg) != 0 
     || pthread_attr_destroy(&attr) != 0 
     || pthread_detach(t) != 0) { 
    printf("Unable to launch a thread\n"); 
    exit(1); 
    } 
} 

int main() 
{ 
    startThread(test1, NULL); 
    startThread(test2, NULL); 

    sleep(4); 
    printf("main thread return.\n"); 

    return 0; 
} 

Cuando el "hilo principal regresa". apagar, thread test1 y test2 también salir, cualquiera me puede decir por qué?

+0

El texto de la pregunta no coincide con el cuerpo de la pregunta. ¿Esto es lo que sucede cuando sale el hilo principal? ¿O se trata de lo que sucede cuando el hilo principal regresa de la función 'main'? (Obviamente, el hilo no puede regresar si sale. Puede hacer uno u otro). –

Respuesta

9

Cuando vuelve el hilo principal, finaliza todo el proceso. Esto incluye todos los otros hilos. Lo mismo sucede cuando llamas al exit.

El propósito de pthread_detach es hacerlo de forma que no necesite unirse con otros hilos para liberar sus recursos. Separar un hilo no lo hace existir después de la terminación del proceso, aún se destruirá junto con todos los otros hilos.

+16

Esta respuesta tal como está escrita no es verdad. Cuando el hilo principal (o cualquier hilo) llama a 'exit', o cuando la invocación inicial de' main' regresa, todo el proceso sale. Pero el hilo principal puede salir con 'pthread_exit' sin afectar a otros hilos. –

19

Debe usar pthread_join() en cada uno de los nuevos subprocesos, para informar al subproceso de llamada que espere en los subprocesos, suspendiendo la ejecución y el proceso de salida hasta que los subprocesos finalicen.

Llamar a pthread_detach sobre las roscas creadas no lo hará mantenerlas después de que finalice un proceso. Desde el linux man page:

El atributo separado simplemente determina el comportamiento del sistema cuando finaliza el hilo; no impide que el hilo termine si el proceso finaliza usando exit (3) (o de manera equivalente, si el hilo principal retorna).

Vas a veces se ve un pthread_exit en main utilizado en lugar de explícitas pthread_join llamadas, la intención es que la salida main de esta manera permitirá que otros hilos puedan continuar funcionando. De hecho, los estados linux man page esto explícitamente:

Para permitir que los hilos para continuar la ejecución, el hilo principal debe terminar llamando pthread_exit() en lugar de la salida (3).

Pero no sé si este es el comportamiento esperado en todas las plataformas, y siempre he mantenido el uso de pthread_join.

pthread_join requiere la pthread_t para el subproceso de destino, por lo que el código tendrá que cambiar un poco ya que se necesita para crear los dos hilos antes de llamar pthread_join que esperar para los dos. Entonces no puedes llamarlo al startThread. Tendrá que devolver un pthread_t, o pasar un puntero a un pthread_t a su función startThread.

+1

Pero utilizo la función pthread_detach para evitar esto. – laifjei

+2

Lea atentamente los documentos de ['pthread_detach'] (http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html). No hace lo que pareces pensar. – pb2q

+0

@laifjei Quizás confundas detach con la funcionalidad provista e. gramo. en Java/C#/Python/etc. - hilos daemon. Java internamente mantiene vivo el proceso mientras que cualquier subproceso que no sea demonio se deja con vida (aunque el hilo principal muera). –

Cuestiones relacionadas