Boost ASIO :: Он использует epoll под linux и, следовательно, не является истинным асинхронным шаблоном, поскольку порождает потоки, которые полностью абстрагированы от пользовательского кода для получения шаблона проектирования proactor
Этонеправильно.Библиотека Asio использует epoll()
по умолчанию в большинстве последних версий ядра Linux.однако потоки, вызывающие io_service::run()
, будут вызывать обработчики обратного вызова по мере необходимости.В библиотеке Asio есть только одно место, где поток используется для эмуляции асинхронного интерфейса, это хорошо описано в документации :
Для io_service используется дополнительный потокэмулировать асинхронное разрешение хоста.Этот поток создается при первом вызове либо ip::tcp::resolver::async_resolve()
, либо ip::udp::resolver::async_resolve()
.
Это не делает библиотеку "не истинным асинхронным шаблоном", как вы утверждаете, на самом деле ее имя может не совпадатьс вами по определению.
1) Какой будет лучший шаблон проектирования для написания быстро масштабируемого сетевого сервера с использованием epoll (конечно, здесь придется использовать потоки :()
Я предлагаю использовать Boost Asio, он использует шаблон проектирования проактора.
3) Boost ASIO использует один большой замок вокруг вызова epoll.Я на самом деле не понимал, каковы могут быть его последствия и как их преодолеть, используя саму asio
В реакторе epoll используется мьютекс для отправки обработчиков, хотя на практике это не представляет большой проблемы для большинства приложений.Существуют специфичные для приложений способы смягчения этого поведения, например io_service
на процессор для использования локальности данных.См. мой ответ на аналогичный вопрос по этой теме.Это также часто обсуждается в списке рассылки Asio .
4) Как я могу изменить шаблон ASIO для работы с дисковыми файлами?Есть ли рекомендуемый шаблон проектирования?
Библиотека Asio изначально не поддерживает файловый ввод-вывод, как вы заметили.Было несколько попыток добавить его в библиотеку, я бы посоветовал обсудить в список рассылки .