Читать «UNIX: взаимодействие процессов» онлайн - страница 324

Уильям Ричард Стивенс

Функции Posix для работы с потоками обычно возвращают 0 в случае успешного завершения работы и ненулевое значение в случае ошибки. В отличие от большинства системных функций, возвращающих –1 в случае ошибки и устанавливающих значение errno равным коду ошибки, функции Pthread возвращают положительный код ошибки. Например, если pthread_create не сможет создать новый поток из-за превышения системного oгрaничeния на потоки, эта функция вернет значение EAGAIN. Функции Pthread не устанавливают значение переменной errno. Несоответствий при их вызове не возникает, поскольку ни один из кодов ошибок не имеет нулевого значения (<sys/errno.h>).

Функция pthread_join

Мы можем ожидать завершения какого-либо процесса, вызвав pthread_join. Сравнивая потоки с процессами Unix, можно сказать, что pthread_create аналогична fork, a pthread_join — waitpid:

#include <pthread.h>

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

/* Возвращает 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */

Мы должны указать идентификатор потока, завершения которого ожидаем. К сожалению, невозможно задать режим ожидания завершения нескольких потоков (аналога waitpid с идентификатором процесса –1 нет).

Если указатель status ненулевой, возвращаемое потоком значение (указатель на объект) сохраняется в ячейке памяти, на которую указывает status.

Функция pthread_self

У каждого потока имеется свой идентификатор, уникальный в пределах данного процесса. Идентификатор возвращается pthread_create и используется при вызове pthread_join. Поток может узнать свой собственный идентификатор вызовом pthread_self:

#include <pthread.h>

pthread_t pthread_self(void);

/* Возвращает идентификатор вызвавшего потока */

Вызов pthread_self является аналогом getpid для процессов Unix.

Функция pthread_detach

Поток может являться как присоединяемым (по умолчанию), так и отсоединенным. При завершении присоединяемого потока его идентификатор и статус завершения сохраняются до тех пор, пока какой-либо другой поток данного процесса не вызовет pthread_join. Отсоединенный поток функционирует аналогично процессу-демону. После его завершения все ресурсы освобождаются. Никакой другой поток не может ожидать его завершения. Если имеется необходимость ожидания одним потоком завершения другого, лучше оставить последний присоединяемым.

Функция pthread_detach делает данный поток отсоединенным:

#include <pthread.h>

int pthread_detach(pthread_t tid);

/* Возвращает 0 в случае успешного завершения, положительное значение Еххх в случае ошибки */

Эта функция вызывается потоком при необходимости изменить собственный статус в форме

pthread_detach(pthread_self());

Функция pthread_exit

Одним из способов завершения потока является вызов pthread_exit:

#include <pthread.h>

void pthread_exit(void *status);

/* ничего не возвращает вызвавшему потоку */

Если поток не является отсоединенным, его идентификатор и статус завершения сохраняются для возвращения другому потоку, который может вызвать pthread_join.