30.10. Параллельный сервер TCP: один поток для каждого клиента

30.10. Параллельный сервер TCP: один поток для каждого клиента

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

Наша первая версия сервера с использованием потоков показана в листинге 30.20. Это модификация листинга 30.2: в ней создается один поток для каждого клиента вместо одного дочернего процесса для каждого клиента. Эта версия во многом похожа на сервер, представленный в листинге 26.2.

Листинг 30.20. Функция main для сервера TCP, использующего потоки

//server/serv06.c

 1 #include "unpthread.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int listenfd, connfd;

 6  void sig_int(int);

 7  void *doit(void*);

 8  pthread_t tid;

 9  socklen_t clilen, addrlen;

10  struct sockaddr *cliaddr;

11  if (argc == 2)

12   listenfd = Tcp_listen(NULL, argv[1], &addrlen);

13  else if (argc == 3)

14   listenfd = Tcp_listen(argv[1], argv[2], &addrlen);

15  else

16   err_quit("usage: serv06 [ <host> ] <port#>");

17  cliaddr = Malloc(addrlen);

18  Signal (SIGINT, sig_int);

19  for (;;) {

20   clilen = addrlen;

21   connfd = Accept(listenfd, cliaddr, &clilen);

22   Pthread_create(&tid, NULL, &doit, (void*)connfd);

23  }

24 }

25 void*

26 doit(void *arg)

27 {

28  void web_child(int);

29  Pthread_detach(pthread_self());

30  web_child((int)arg);

31  Close((int)arg);

32  return (NULL);

33 }

Цикл основного потока

19-23 Основной поток блокируется в вызове функции accept, и каждый раз, когда прибывает новое клиентское соединение, функцией pthread_create создается новый поток. Функция, выполняемая новым потоком, — это функция doit, а ее аргументом является присоединенный сокет.

Функция прочих потоков

25-33 Функция doit выполняется как отсоединенный (detached) поток, потому что основному потоку не требуется ждать ее завершения. Doit вызывает функцию web_child (см. листинг 30.5). Когда эта функция возвращает управление, присоединенный сокет закрывается.

Из табл. 30.1 мы видим, что эта простая версия с использованием потоков является более быстродействующей, чем даже самая быстрая из версий с предварительным порождением процессов. Кроме того, эта версия, в которой каждый клиент обслуживается одним потоком, во много раз быстрее версии, в которой каждый клиент обслуживается специально созданным для него дочерним процессом (первая строка табл. 30.1).

ПРИМЕЧАНИЕ

В разделе 26.5 мы упомянули о трех вариантах преобразования функции, которая не является безопасной в многопоточной среде, в функцию, обеспечивающую требуемую безопасность. Функция web_child вызывает функцию readline, и версия, показанная в листинге 3.12, не является безопасной в многопоточной среде. На примере, приведенном в листинге 30.20, были испробованы вторая и третья альтернативы из раздела 26.5. Увеличение быстродействия при переходе от альтернативы 3 к альтернативе 2 составило менее одного процента, вероятно, потому, что функция readline использовалась лишь для считывания значения счетчика (5 символов) от клиента. Поэтому в данной главе для простоты мы использовали более медленную версию из листинга 3.11 для сервера с предварительным порождением потоков.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.3 Параллельный конструктив

Из книги ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ. ПРОГРАММНЫЕ КОНСТРУКТИВЫ И УСЛОВНЫЕ ОБОЗНАЧЕНИЯ ДЛЯ ИХ ПРЕДСТАВЛЕНИЯ автора Госстандарт России


Параллельный размер

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

Параллельный размер С помощью команды DIMALIGNED создается размер, параллельный измеряемой линии объекта; это позволяет выровнять размерную линию по объекту. Размер создается подобно горизонтальному, вертикальному и повернутому, при этом размерная линия расположена


Параллельный размер

Из книги AutoCAD 2009. Начали! автора Соколова Татьяна Юрьевна

Параллельный размер С помощью команды DIMALIGNED создается размер, параллельный измеряемой линии объекта; это позволяет выровнять размерную линию по объекту. Размер создается подобно горизонтальному, вертикальному и повернутому, при этом размерная линия расположена


11.7.2 Доставка запроса от клиента на сервер

Из книги Scrum и XP: заметки с передовой автора Книберг Хенрик

11.7.2 Доставка запроса от клиента на сервер Клиент не имеет сведений об адресе для направления запроса и отправляет его с IP-адресом источника 0.0.0.0 и IP-адресом приемника 255.255.255.255.Сервер (или серверы) в одной с клиентом локальной сети услышит посланный запрос. Если клиент


18.10.4. Dante — еще один сервер SOCKS5

Из книги Инфобизнес на полную мощность [Удвоение продаж] автора Парабеллум Андрей Алексеевич

18.10.4. Dante — еще один сервер SOCKS5 Этот сервер считается более простым в настройке. Он использует файл конфигурации /etc/sockd.conf (листинг 18.2).Листинг 18.2. Примерный файл /etc/sockd.confinternal: 192.168.0.1 port = 1080external: 111.111.111.111client pass { from: 192.168.0.0/16 to: 0.0.0.0/0}pass { from: 0.0.0.0/0 to: 192.168.0.0/16 command: bindreply udpreply log:


Параллельный размер

Из книги Инфобизнес за один день автора Ушанов Азамат

Параллельный размер С помощью команды DIMALIGNED создается размер, параллельный измеряемой линии объекта; это позволяет выровнять размерную линию по объекту. Размер создается подобно горизонтальному, вертикальному и повернутому, при этом размерная линия расположена


7. Предложение коучинга в мини-группе или один на один

Из книги Цифровой журнал «Компьютерра» № 200 автора Журнал «Компьютерра»

7. Предложение коучинга в мини-группе или один на один Если человек оплатил товар и даже купил у вас что-то еще, это не повод останавливаться. Вы можете позвонить всем клиентам по телефону и предложить бесплатную 15-минутную личную консультацию и продать коучинг один на


PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов Опубликовано 18 ноября 2013 Затянувшееся перемирие в войне игровых консолей окончено: в пятницу в США стартовали продажи Sony PlayStation 4, а её основной соперник, Xbox One от


10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main

Из книги автора

10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main Наши клиент и сервер SCTP вызывают функции в последовательности, представленной на рис. 9.2. Код последовательного сервера представлен в листинге 10.1[1].Листинг 10.1. Потоковый эхо-сервер SCTP//sctp/sctpserv01.c 1 #include "unp.h" 2 int 3


23.2. Сервер типа «один-ко-многим» с автоматическим закрытием

Из книги автора

23.2. Сервер типа «один-ко-многим» с автоматическим закрытием Вспомните программу-сервер, которую мы написали в главе 10. Эта программа не отслеживала ассоциации. Сервер рассчитывал, что клиент самостоятельно закроет ассоциацию, удалив тем самым данные о ее состоянии.


30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента

Из книги автора

30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента Традиционно параллельный сервер TCP вызывает функцию fork для порождения нового дочернего процесса, который будет выполнять обработку очередного клиентского запроса. Это позволяет серверу обрабатывать


30.12. Сервер с предварительным порождением потоков: основной поток вызывает функцию accept

Из книги автора

30.12. Сервер с предварительным порождением потоков: основной поток вызывает функцию accept Последняя рассматриваемая нами версия сервера устроена следующим образом: главный поток создает пул потоков при запуске сервера, после чего он же вызывает функцию accept и передает