Según la página del manual:
La función pthread_join() suspenderá la ejecución del subproceso de llamada hasta que finalice el subproceso de destino, a menos que el subproceso de destino ya haya terminado.
Entonces, según tengo entendido, el proceso de llamada se bloqueará hasta que salga el hilo especificado.
Ahora considere el siguiente código:
pthread_t thrs[NUMTHREADS]; for (int i = 0; i < NUMTHREADS; i++) { pthread_create(&thrs[i], NULL, thread_main, NULL); } pthread_join(thrs[0], NULL); /* will be blocked here */ pthread_join(thrs[1], NULL); pthread_join(thrs[2], NULL); /* ... */ pthread_join(thrs[NUMTHREADS - 1], NULL); El subproceso de llamada se bloqueará en la llamada a pthread_join(thrs[0], NULL) , hasta thrs[0] salga de alguna manera. Pero, ¿cómo si otro hilo, por ejemplo, thrs[2] llama a pthread_exit() mientras estamos bloqueados en la llamada a pthread_join(thrs[0], NULL) ? ¿Tenemos que esperar a que thrs[0] salga para recibir el valor de retorno de thrs[2] ?
Pero, ¿cómo si otro hilo, digamos thrs[2] sale mientras estamos bloqueados en la llamada a pthread_join(thrs[0], NULL)?
Sí, podría pasar. En ese caso, pthread_join(thrs[2], NULL); regresará inmediatamente.
¿Tenemos que esperar a que thrs[0] salga para recibir el valor de retorno de thrs[2]?
Sí, debe esperar a que thr[0] finalice.
(No directamente relacionado con la pregunta)
No es necesario llamar a pthread_join() en cada subproceso que cree. Es una función conveniente para obtener el estado de retorno de los hilos. Si no necesita saber el estado de finalización del hilo, puede crear el hilo al ver el atributo "separado" o llamar a pthread_detach(pthread_self()); del propio hilo para que se desprenda. En algunos casos, desearía que los subprocesos creados continuaran con la ejecución, pero ya no necesitarían el subproceso principal . En ese caso, podría llamar a pthread_exit(NULL); del subproceso principal que permitirá que otros subprocesos continúen incluso después de que finalice el subproceso principal.
Sí, el subproceso principal bloqueado en thrs[0] no obtendrá el resultado de thrs[2] hasta después de thrs[[0] y thrs[1] también hayan salido.
Si necesita más flexibilidad, una opción es hacer algo como que los subprocesos publiquen sus resultados en una cola o señalen de alguna otra manera que el subproceso debe unirse. El subproceso principal puede monitorear esa cola/señal y obtener los resultados necesarios (que podrían provenir de un pthread_join() que se realiza en el subproceso que se sabe que se completó a partir de la información en la cola/señal).
Sí. El código se ejecuta en serie.