Главная страница Взаимодействие нетривиальных процессов большинства системных функций, возвращающих -1 в случае ошибки и устанавливающих значение еггпо равным коду ошибки, функции Pthread возвращают положительный код ошибки. Например, если pthread create не сможет создать новый поток из-за превышения системного ограничения на потоки, эта функция вернет значение EAGAI N. Функции Pthread не устанавливают значение переменной еггпо. Несоответствий при их вызове не возникает, поскольку ни один из кодов ошибок не имеет нулевого значения (<sys/errno.h>). Функция pthreadjoin Мы можем ожидать завершения какого-либо процесса, вызвав pthreadjoi п. Сравнивая потоки с процессами Unix, можно сказать, что pthreadjreate аналогична fork, а pthreadjoin - waitpid: #include <pthread.h> int pthreadjoi n( pthread J tid. void **stdtus): I* Возвращает 0 в случае успешного завершения, положительное значение Еххх - в случае ошибки */ Мы должны указать идентификатор потока, завершения которого ожидаем. К сожалению, невозможно задать режим ожидания завершения нескольких потоков (аналога waitpid с идентификатором процесса -1 нет). Если указатель status ненулевой, возвращаемое потоком значение (указатель на объект) сохраняется в ячейке памяти, на которую указывает status. Функция pthread.self у каждого потока имеется свой идентификатор, уникальный в пределах данного процесса. Идентификатор возвращается pthreadjreate и используется при вызове pthreadjoin. Поток может узнать свой собственный идентификатор вызовом pthreadjelf: linclude <pthread.h> pthreadj pthread self(void); /* Возвращает идентификатор вызвавшего потока */ Вызов pthreadjel f является аналогом getpi d для процессов Unix. Функция pthread.detach Поток может являться как присоединяемым (по умолчанию), так и отсоединенным. При завершении присоединяемого потока его идентификатор и статус завершения сохраняются до тех пор, пока какой-либо другой поток данного процесса не вызовет pthreadjoi п. Отсоединенный поток функционирует аналогично процессу-демону. После его завершения все ресурсы освобождаются. Никакой другой поток не может ожидать его завершения. Если имеется необходимость ожидания одним потоком завершения другого, лучше оставить последний присоединяемым. Функция pthread detach делает данный поток отсоединенным: #include <pthread.h> int pthreadJetachtpthreadJ tid): I* Возвращает 0 в случае успешного завершения, положительное значение Еххх в случае ошибки */ Эта функция вызывается потоком при необходимости изменить собственный статус в форме pthread detach(pthread self()): Функция pthread exit Одним из способов завершения потока является вызов pthread exi t: #inc1ude <pthread.h> void pthread exit(void *status); I* ничего не возвращает вызвавшему потоку */ Если поток не является отсоединенным, его идентификатор и статус завершения сохраняются для возвращения другому потоку, который может вызвать pthreadjoin. Указатель status не должен быть установлен на локальный объект вызвавшего потока (типа автоматической переменной), поскольку этот объект уничтожается при завершении потока. Поток может быть завершен двумя другими способами: И начальная функция потока (третий аргумент pthread create) может вызвать return. Поскольку эта функция должна объявляться как возвращающая указатель на тип voi d, это возвращаемое значение становится статусом завершения потока; И функция main процесса может завершить работу или один из потоков может вызвать exi t или exi t. При этом процесс завершает работу немедленно, вместе со всеми своими потоками. ПРИЛОЖЕНИЕ В Вспомогательные исходные коды в.1. Заголовочный файл unpipc.h Почти все программы книги подключают заголовочный файл unpi рс. h, приведенный в листинге В.1. Он подключает все стандартные системные заголовки, нужные большинству программ для работы с сетью, вместе с некоторыми общими системными заголовками. Он также определяет константы типа MAXLINE и прототипы функций ANSI С для функций, определенных в тексте (типа px ipc name), и для всех используемых в книге оберток. Мы не приводим эти прототипы. Листинг В.1. Заголовочный файл unpipc.h lib/unpipc.h 1 /* Наш заголовочный файл, */ 2 #ifndef 3 #define 4 #include 5 unpipc h unpipc h , ./config.h /* параметры конфигурации ОС */ /* ../config.h создается сценарием configure */ 6 /* изменяя список директив #include. нужно изменять файлы 7 ,./aclocal.т4 и ../configure.in. чтобы работал сценарий configure */ 9 10 11 #i nclude #inc1ude #inc1ude #inc1ude 12 #inc1ude 13 #inc1ude 14 #include 15 #inc1ude 16 #include 17 #inc1ude 18 #inc1ude 19 #inc1ude 20 #inc1ude <sys/types,h> <sys/time.h> <tinie.h> <errno.h> <fcntl.h> <1imits.h> <signal.h> <stdio.h> <stdlib.h> <string.h> <sys/stat.h> <unistd.h> <sys/wait.h> /* базовые типы данных */ /* структура timeval{} для selectO */ /* timespecO для pselectO */ /* отключение блокировки */ /* PIPE BUF */ /* константы режима доступа к файлу S xxx */
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |