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