Почему в boost :: asio обработчик асинхронного принятия должен перезапускать асинхронный прием?

В Дневное время. 3 учебник для boost :: asio (асинхронный TCP-сервер), класс tcp_server содержит следующие два метода:

void start_accept()
{
  tcp_connection::pointer new_connection =
    tcp_connection::create(acceptor_.get_io_service());

  acceptor_.async_accept(new_connection->socket(),
      boost::bind(&tcp_server::handle_accept, this, new_connection,
        boost::asio::placeholders::error));
}

void handle_accept(tcp_connection::pointer new_connection,
    const boost::system::error_code& error)
{
  if (!error) new_connection->start(); // ***

  start_accept();
}

Меня беспокоит строка с пометкой ***. Что делать, если на выполнение этой операции уходит много времени? Даже если это не так, должен быть некоторый промежуток времени между строкой *** и вызовом start_accept, в течение которого сервер не сможет принимать входящие соединения. Разве для async_accept не имеет смысла регистрировать обработчик ОС, который не останавливается, когда принимает свое первое соединение? Кроме того, это реальная проблема, и как я могу ее исправить?


person jcai    schedule 10.01.2014    source источник


Ответы (1)


Сервер не будет «отказываться принимать входящие соединения»; для этого нужен второй параметр функции listen() в API сокетов. Но вы правы, что сервер может задерживать обработку клиентского запроса. Однопотоковое приложение, требующее большого количества вычислений, вызовет проблемы, поэтому этот конкретный пример действительно выполняет только ввод-вывод. Если вашему серверу действительно нужно выполнять что-то, что сильно нагружает ЦП, то обработчик следует передать в какой-то диспетчер задач.

person chrisaycock    schedule 10.01.2014