next up previous contents
Next: Отделение потока. Up: Потоки (threads). Previous: Создание потока.   Contents

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

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

int pthread_join(thread_t tid, void **status);
Пример использования функции (рис. 25):

#include <pthread.h>

pthread_t tid;

int ret;

int status;

/* ожидание завершения потока "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:

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

}

Рис. 26. Скелет многопоточного приложения.



2003-12-09