Я решил это раньше, но хочу ответить на мой вопрос.
Решение, которое я принял:
- 1 поток акцептора - (accept () для новоговходящие соединения в режиме блокировки) и назначение соединений сетевым потокам с балансировкой нагрузки
- N сетевых потоков, где N = (1 поток на 1000 клиентов) с неблокирующим поведением:
- инициализация
- во время работы сервера
- установить наблюдателя тайм-аута (для отключения блокировки в цикле событий)
- запустить цикл событий
- остановить наблюдателя тайм-аута
- добавить новые сокеты изпоток-получатель
- перебирает соединения, запускает Update (), пытается сбросить вывод, проверяет закрытие и т. д., если Update () возвращает -1, удаляет соединение из списка
- end while
- освободить и закрыть все соединения и освободить всю выделенную память
- return
- Рабочие потоки с семафорами posix, ожидающими задания (пул потоков какуправление)
- (Оптиonal) Фоновый поток с низким приоритетом для планирования и проверки, удаления, например, токенов, сессий и т. д. Много сна.
Я написал собственный обработчик fastcgi.Я также использовал libev для сетевых потоков, буферизованного и прямого вывода, автоматического пробуждения и отключения события записи.Отладка с помощью Valgrind.Clang clang.
Реакции на другие ответы:
Я не хотел использовать поток на соединение, потому что он имеет определенную стоимость при порождении, а также при большом количестве потоков,есть также замедление и более высокое использование памяти.
И я не использовал boost asio, потому что мне не нравятся фреймворки, и асинхронный ввод-вывод не был тем, который я искал.