Функция pthread_join() используется для ожидания завершения потока:
pthread_t tid;
int ret;
int status;
/* ожидание завершения потока "tid" со статусом status */
ret = pthread_join(tid, &status);
/* ожидание завершения потока "tid" без статуса */
ret = pthread_join(tid, NULL);
Функция pthread_join() блокирует вызывающий поток, пока указанный поток не завершится. Указанный поток должен принадлежать текущему процессу и не должен быть отделен. Если status не равен NULL, он указывает на переменную, которая принимает значение статуса выхода завершенного потока при успешном завершении pthread_join(). Несколько потоков не могут ждать завершения одного и того же потока. Если они пытаются выполнить это, один поток завершается успешно, а все остальные - с ошибкой ESRCH. После завершения pthread_join(), любое пространство стека, связанное с потоком, может быть использовано приложением.
В следующем примере (рис. 26) один поток верхнего уровня вызывает процедуру, которая создает новый вспомогательный поток, выполняющий сложный поиск в базе данных, требующий определенных затрат времени. Главный поток ждет результатов поиска, и в то же время может выполнять другую работу. Он ждет своего помощника с помощью функции pthread_join(). Аргумент pbe является параметром стека для нового потока.
Исходный код для thread.c:
{
struct phonebookentry *pbe;
pthread_attr_t tattr;
pthread_t helper;
int status;
pthread_create(&helper, NULL, fetch, &pbe);
/* выполняет собственную задачу */
pthread_join(helper, &status);
/* теперь можно использовать результат */
}
void fetch(struct phonebookentry *arg)
{
struct phonebookentry *npbe;
/* ищем значение в базе данных */
npbe = search (prog_name)
if (npbe != NULL)
*arg = *npbe;
pthread_exit(0);
}
struct phonebookentry {
char name[64];
char phonenumber[32];
char flags[16];
}