У каждого потока имеется несколько
pthread_attr_t
, что позволяет заменить значение, заданное по умолчанию. Обычно мы используем значение по умолчанию, в этом случае мы задаем аргумент attr
равным пустому указателю.Наконец, при создании потока мы должны указать, какую функцию будет выполнять этот поток. Выполнение потока начинается с вызова заданной функции, а завершается либо явно (вызовом pthread_exit
func
, и она вызывается с единственным аргументом-указателем arg
. Если этой функции необходимо передать несколько аргументов, следует поместить их в некоторую структуру и передать адрес этой структуры как единственный аргумент функции.Обратите внимание на объявления func
arg
. Функции передается один аргумент — универсальный указатель void*
. Это позволяет нам передавать потоку с помощью единственного указателя все, что требуется, и точно так же поток возвращает любые данные, используя этот указатель.Возвращаемое значение функций Pthreads — это обычно 0 в случае успешного выполнения или ненулевая величина в случае ошибки. Но в отличие от функций сокетов и большинства системных вызовов, для которых в случае ошибки возвращается -1 и переменной errno
pthread_create
не может создать новый поток, так как мы превысили допустимый системный предел количества потоков, функция возвратит значение EAGAIN
. Функции Pthreads не присваивают переменной errno
никаких значений. Соглашение о том, что 0 является индикатором успешного выполнения, а ненулевое значение — индикатором ошибки, не приводит к противоречию, так как все значения Exxx
, определенные в заголовочном файле
, являются положительными. Ни одному из имен ошибок Exxx не сопоставлено нулевое значение.Функция pthread_join
Мы можем приостановить выполнение текущего потока и ждать завершения выполнения какого-либо другого потока, используя функцию pthread_join
pthread_create
аналогична функции fork
, а функция pthread_join
— функции waitpid
.#include
int pthread_join(pthread_t
Следует указать идентификатор tid
waitpid
ждать завершения любого процесса, задав аргумент идентификатора процесса, равный -1). Мы вернемся к этой проблеме при обсуждении листинга 26.11.Если указатель status
status
.Функция pthread_self
Каждый поток снабжен идентификатором, уникальным в пределах данного процесса. Идентификатор потока возвращается функцией pthread_create
pthread_join
. Поток может узнать свой собственный идентификатор с помощью вызова pthread_self
.#include
pthread_t pthread_self(void);
Сравнивая потоки и процессы Unix, можно отметить, что функция pthread_self
getpid
.Функция pthread_detach
Поток может быть либо
pthread_join
. В свою очередь, отсоединенный поток напоминает процесс-демон: когда он завершается, все занимаемые им ресурсы освобождаются и мы не можем отслеживать его завершение. Если один поток должен знать, когда завершится выполнение другого потока, нам следует оставить последний присоединяемым.Функция pthread_detach
#include
int pthread_detach(pthread_t