в программировании сокетов, может принимать () один и тот же прослушивающий сокет в многопроцессорном режиме (потоке)? - PullRequest
2 голосов
/ 15 апреля 2010

1001 * т.е. *

  1. открыть сокет прослушивания в родительском процессе
  2. вызов epoll_wait (listen_socket) для child1, child2, child3 ....
  3. звонок принимается у каждого ребенка, если есть запрос на соединение

Ответы [ 2 ]

4 голосов
/ 15 апреля 2010

Как правило, не рекомендуется, чтобы несколько потоков выполняли ввод-вывод в одном сокете без какой-либо синхронизации между ними. В вашем сценарии возможно, что вы увидите что-то вроде:

  • входящий запрос на подключение активирует epoll_wait во всех N дочерних потоках
  • вызов всех N потоков accept, 1 вызов успешен, блок N-1 (или сбой, если ваш прослушивающий сокет не блокируется)

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

3 голосов
/ 18 мая 2010

Да, вы можете, но ваш пример немного неполон:

  1. Создать listen_socket
  2. Создание набора epoll с использованием epoll_create
  3. Зарегистрируйте listen_socket для набора epoll , используя epoll_ctl
  4. вызов epoll_wait ( набор epoll ) в child1, child2, child3 ....
  5. звоните принимайте у каждого ребенка, если есть запрос на соединение

epoll_wait гарантирует, что только один поток получит событие соединения, и только этот поток вызовет accept.

Если вы создадите два набора epoll и зарегистрируете свой listen_socket для них обоих, вы получите событие дважды, один раз за набор epoll, и это не рекомендуется.

Вы можете обратиться к этому руководству http://www.devshed.com/c/a/BrainDump/Linux-Files-and-the-Event-Poll-Interface/ и поискать некоторые интересные дискуссии об epoll на этом форуме http://www.developerweb.net/forum/, чтобы узнать больше.

Для более сложных примеров вы всегда можете обратиться к исходному коду libev, libevent или nginx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...