/ * Очікування завершення потоку "tid" зі статусом status * /
ret = pthread_join (tid, status);
/ * Очікування завершення потоку "tid" без статусу * /
ret = pthread_join (tid, NULL);
Мал. 25. Завершення потоку.
Функція pthread_join () блокує викликає потік, поки вказаний потік не завершиться. Зазначений потік повинен належати поточному процесу і не повинен бути відділений. Якщо status НЕ дорівнює NULL. він вказує на змінну, яка приймає значення статусу виходу завершеного потоку при успішному завершенні pthread_join (). Кілька потоків не можуть чекати завершення одного і того ж потоку. Якщо вони намагаються виконати це, один потік завершується успішно, а всі інші - з помилкою ESRCH. Після завершення pthread_join (), будь-який простір стека, пов'язане з потоком, може бути використано додатком.
У наступному прикладі (рис. 26) один потік верхнього рівня викликає процедуру, яка створює новий допоміжний потік, що виконує складний пошук в базі даних, що вимагає певних витрат часу. Головний потік чекає результатів пошуку, і в той же час може виконувати іншу роботу. Він чекає свого помічника за допомогою функції pthread_join (). Аргумент pbe є параметром стека для нового потоку.
Вихідний код для thread.c.
struct phonebookentry * pbe;
pthread_create (helper, NULL, fetch, pbe);
/ * Виконує власне завдання * /
/ * Тепер можна використовувати результат * /