salida principal del hilo, ¿hay otra salida también?

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 un código de prueba, como este:

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é?

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

El objective de pthread_detach es hacerlo de modo que no necesite unirse a 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.

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

Llamar a pthread_detach en los hilos creados no los mantendrá cerca después de que un proceso finalice. Desde la página de manual de linux:

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

A veces verá un pthread_exit en las main llamadas pthread_join utilizadas en lugar de explícitas, la intención es que salir de main de esta manera permita que otros subprocesos continúen ejecutándose. De hecho, la página del manual de Linux lo dice explícitamente:

Para permitir que otros subprocesos continúen la ejecución, el hilo principal debe terminar llamando a pthread_exit () en lugar de salir (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 pthread_t para el subproceso objective, por lo que deberá cambiar un poco el código, ya que debe crear ambos subprocesos antes de llamar a pthread_join para esperarlos. Entonces no puedes llamarlo en startThread . Tendrá que devolver un pthread_t , o pasar un puntero a un pthread_t a su función startThread .