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

в Daytime.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 зарегистрировать обработчик ОС, который не останавливается, когда он принимает свое первое соединение? Кроме того, это реальная проблема и как бы я ее исправить?

0

Решение

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector