Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 [ 167 ] 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

большинства системных функций, возвращающих -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 */



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 [ 167 ] 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.