Чтение онлайн

на главную

Жанры

UNIX: разработка сетевых приложений
Шрифт:

Функция

pthread_detach
изменяет состояние потока, превращая его из присоединяемого в отсоединенный.

#include <pthread.h>

int pthread_detach(pthread_t tid);

Возвращает: 0 в случае успешного выполнения, положительное значение Exxx в случае ошибки

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

pthread_detach(pthread_self);

Функция pthread_exit

Одним

из способов завершения потока является вызов функции
pthread_exit
.

#include <pthread.h>

void pthread_exit(void * status);

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

Если поток не является отсоединенным, идентификатор потока и статус завершения сохраняются до того момента, пока какой-либо другой поток данного процесса не вызовет функцию

pthread_join
.

Указатель

status
не должен указывать на объект, локальный по отношению к вызывающему потоку, так как этот объект будет уничтожен при завершении потока.

Существуют и другие способы завершения потока.

Функция, которая была вызвана потоком (третий аргумент функции

pthread_create
), может возвратить управление в вызывающий процесс. Поскольку, согласно своему объявлению, эта функция возвращает указатель
void
, возвращаемое ею значение играет роль статуса завершения данного потока.

Если функция

main
данного процесса возвращает управление или любой поток вызывает функцию
exit
, процесс завершается вместе со всеми своими потоками.

26.3. Использование потоков в функции str_cli

В качестве первого примера использования потоков мы перепишем нашу функцию

str_cli
. В листинге 16.6 была представлена версия этой функции, в которой использовалась функция
fork
. Напомним, что были также представлены и некоторые другие версии этой функции: изначально в листинге 5.4 функция блокировалась в ожидании ответа и была, как мы показали, далека от оптимальной в случае пакетного ввода; в листинге 6.2 применяется блокируемый ввод-вывод и функция
select
; версии, показанные в листинге 16.1 и далее, используют неблокируемый ввод-вывод.

На рис. 26.1 показана структура очередной версии функции str_cli, на этот раз использующей потоки, а в листинге 26.1 [1] представлен код этой функции.

Рис. 26.1. Измененная функция str_cli, использующая потоки

Листинг 26.1. Функция str_cli, использующая потоки

//threads/strclithread.c

1 #include "unpthread.h"

2 void *copyto(void*);

1

Все

исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

3 static int sockfd; /* глобальная переменная, доступная обоим потокам */

4 static FILE *fp;

5 void

6 str_cli(FILE *fp_arg, int sockfd_arg)

7 {

8 char recvline[MAXLINE];

9 pthread_t tid;

10 sockfd = sockfd_arg; /* копирование аргументов во внешние переменные */

11 fp = fp_arg;

12 Pthread_create(&tid, NULL, copyto, NULL);

13 while (Readline(sockfd, recvline. MAXLINE) > 0)

14 Fputs(recvline, stdout);

15 }

16 void*

17 copyto(void *arg)

18 {

19 char sendline[MAXLINE];

20 while (Fgets(sendline, MAXLINE, fp) != NULL)

21 Writen(sockfd, sendline, strlen(sendline));

22 Shutdown(sockfd, SHUT_WR); /* признак конца файла в стандартном

потоке ввода, отправка сегмента FIN */

23 return (NULL);

24 /* завершение потока происходит, когда в стандартном потоке ввода

встречается признак конца файла */

25 }

Заголовочный файл unpthread.h

1
Мы впервые встречаемся с заголовочным файлом
unpthread.h
. Он включает наш обычный заголовочный файл
unp.h
, затем — заголовочный файл POSIX
<pthread.h>
, и далее определяет прототипы наших потоковых функций-оберток для
pthread_XXX
(см. раздел 1.4), название каждой из которых начинается с
Pthread_
.

Сохранение аргументов во внешних переменных

10-11
Для потока, который мы собираемся создать, требуются значения двух аргументов функции
str_cli
:
fp
— указатель на структуру
FILE
для входного файла, и
sockfd
— сокет TCP, связанный с сервером. Для простоты мы храним эти два значения во внешних переменных. Альтернативой является запись этих двух значений в структуру, указатель на которую затем передается в качестве аргумента создаваемому потоку.

Поделиться:
Популярные книги

Боксер 2: назад в СССР

Гуров Валерий Александрович
2. Боксер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боксер 2: назад в СССР

Гром над Тверью

Машуков Тимур
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Гром над Тверью

Безымянный раб [Другая редакция]

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
боевая фантастика
9.41
рейтинг книги
Безымянный раб [Другая редакция]

Виконт. Книга 2. Обретение силы

Юллем Евгений
2. Псевдоним `Испанец`
Фантастика:
боевая фантастика
попаданцы
рпг
7.10
рейтинг книги
Виконт. Книга 2. Обретение силы

Титан империи 2

Артемов Александр Александрович
2. Титан Империи
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Титан империи 2

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Измена. Мой заклятый дракон

Марлин Юлия
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Измена. Мой заклятый дракон

Темный Лекарь 5

Токсик Саша
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 5

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Книга пятая: Древний

Злобин Михаил
5. О чем молчат могилы
Фантастика:
фэнтези
городское фэнтези
мистика
7.68
рейтинг книги
Книга пятая: Древний

Наследница Драконов

Суббота Светлана
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Наследница Драконов

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]