26.3. Использование потоков в функции str_cli
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*);
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, связанный с сервером. Для простоты мы храним эти два значения во внешних переменных. Альтернативой является запись этих двух значений в структуру, указатель на которую затем передается в качестве аргумента создаваемому потоку.
Создание нового потока
12 Создается поток, и значение нового идентификатора потока сохраняется в tid. Функция, выполняемая новым потоком, — это copyto. Никакие аргументы потоку не передаются.
Главный цикл потока: копирование из сокета в стандартный поток вывода
13-14 В основном цикле вызываются функции readline и fputs, которые осуществляют копирование из сокета в стандартный поток вывода.
Завершение
15 Когда функция str_cli возвращает управление, функция main завершается при помощи вызова функции exit (см. раздел 5.4). При этом завершаются все потоки данного процесса. В обычном сценарии второй поток уже должен завершиться в результате считывания признака конца файла из стандартного потока ввода. Но в случае, когда сервер преждевременно завершил свою работу (см. раздел 5.12), при вызове функции exit завершается также и второй поток, чего мы и добиваемся.
Поток copyto
16-25 Этот поток осуществляет копирование из стандартного потока ввода в сокет. Когда он считывает признак конца файла из стандартного потока ввода, на сокете вызывается функция shutdown и отсылается сегмент FIN, после чего поток возвращает управление. При выполнении оператора return (то есть когда функция, запустившая поток, возвращает управление) поток также завершается.
В конце раздела 16.2 мы привели результаты измерений времени выполнения для пяти различных реализаций функции str_cli. Мы отметили, что многопоточная версия выполняется всего 8,5 с — немногим быстрее, чем версия, использующая функцию fork (как мы и ожидали), но медленнее, чем версия с неблокируемым вводом-выводом. Тем не менее, сравнивая устройство версии с неблокируемым вводом-выводом (см. раздел 16.2) и версии с использованием потоков, мы заметили, что первая гораздо сложнее. Поэтому мы рекомендуем использовать именно версию с потоками, а не с неблокируемым вводом-выводом.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Пример: использование функции фильтра
Пример: использование функции фильтра Программа 4.3 представляет собой каркас программы, иллюстрирующей обработку исключений и завершения выполнения, в которой используется функция фильтра. Программа предлагает пользователю указать тип исключения, после чего
Использование функции SignalObjectAndWait
Использование функции SignalObjectAndWait Цикл, выполняемый потоком потребителя в предшествующем фрагменте кода, играет очень важную роль в модели CV, поскольку в нем выполняется ожидание изменения состояния, а затем проверяется, является ли состояние именно тем, какое требуется.
Стеки потоков и допустимые количества потоков
Стеки потоков и допустимые количества потоков Следует сделать еще два предостережения. Во-первых, подумайте о размере стека, который по умолчанию составляет 1 Мбайт. В большинстве случаев этого будет вполне достаточно, но если существуют какие-либо сомнения на сей счет,
5.5. Эхо-клиент TCP: функция str_cli
5.5. Эхо-клиент TCP: функция str_cli Эта функция, показанная в листинге 5.4, обеспечивает отправку запроса клиента и прием ответа сервера в цикле. Функция считывает строку текста из стандартного потока ввода, отправляет ее серверу и считывает отраженный ответ сервера, после чего
6.7. Функция str_cli (еще раз)
6.7. Функция str_cli (еще раз) В листинге 6.2 представлена наша обновленная (и корректная) функция str_cli. В этой версии используются функции select и shutdown. Первая уведомляет нас о том, когда сервер закрывает свой конец соединения, а вторая позволяет корректно обрабатывать пакетный
Более простая версия функции str_cli
Более простая версия функции str_cli Неблокируемая версия функции str_cli, которую мы только что показали, нетривиальна: около 135 строк кода по сравнению с 40 строками версии, использующей функцию select с блокируемым вводом-выводом (см. листинг 6.2), и 20 строками начальной версии,
Сравнение времени выполнения различных версий функции str_cli
Сравнение времени выполнения различных версий функции str_cli Итак, мы продемонстрировали четыре различных версии функции str_cli. Для каждой версии мы покажем время, которое потребовалось для ее выполнения, в том числе и для версии, использующей программные потоки (см.
26.2. Основные функции для работы с потоками: создание и завершение потоков
26.2. Основные функции для работы с потоками: создание и завершение потоков В этом разделе мы рассматриваем пять основных функций для работы с потоками, а в следующих двух разделах мы используем эти функции для написания потоковой модификации клиента и сервера
26.4. Использование потоков в эхо-сервере TCP
26.4. Использование потоков в эхо-сервере TCP Теперь мы перепишем эхо-сервер TCP, приведенный в листинге 5.1, используя для каждого клиента по одному потоку вместо одного процесса. Кроме того, с помощью нашей функции tcp_listen мы сделаем эту версию не зависящей от протокола. В
Использование встроенных форматов для функции Format
Использование встроенных форматов для функции Format В табл. 11.2 приводятся именованные встроенные форматы для данных различных типов в VBA. Используйте их как аргумент в функции Format. He забудьте при этом заключить в кавычки имя выбранного вами формата (из первого столбца
Практическое использование потоков
Практическое использование потоков Когда измененяются папкиПеревод А. И. ЛегаловаАнглоязычный оригинал находится на сервере компании Reliable SoftwareВы когда-либо задались вопросом: каким оразом Проводник (Explorer) узнает о том, что некоторое действие должно модифицировать его
Использование функции автоотчета
Использование функции автоотчета Отчет, созданный таким образом, будет отображать все поля и записи базовой таблицы или запроса.В разделе Объекты окна базы данных щелкните сначала по кнопке а затем по кнопке Новый. На экране появится окно Новый отчет – рис. 5.1. Рис.
1.8.5. Использование функции Spotlight для поиска по тексту
1.8.5. Использование функции Spotlight для поиска по тексту Некоторые приложения позволяют выделить часть текста, а затем с помощью Spotlight найти совпадения в других текстовых документах или на web-страницах, хранящихся на Маке. Обратите внимание, поиск будет осуществляться не в
1.8.6. Использование функции Spotlight в системных настройках
1.8.6. Использование функции Spotlight в системных настройках Утилита Системные настройки (System Preferences) — это самый главный пульт управления настройками системы, заданных по умолчанию. Помните, к нему мы обращались для настройки: панели Dock (мини-утилита Dock), элементов окна
Стивенс Уильям Ричард
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉