Ожидание завершения потока

Функция pthread_join() используется для ожидания завершения потока:

int pthread_join(thread_t tid, void **status);

Пример использования функции:

#include <pthread.h>

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 (), любое пространство стека, связанное с потоком, может быть использовано приложением.

В следующем примере один поток верхнего уровня вызывает процедуру, которая создает новый вспомогательный поток, выполняющий сложный поиск в базе данных, требующий определенных затрат времени. Главный поток ждет результатов поиска, и в то же время может выполнять другую работу. Он ждет своего помощника с помощью функции pthread_join (). Аргумент pbe является параметром стека для нового потока.

Исходный код для thread.c:

void mainline (...)

{

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];

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: