@HamsterGamer

Для чего в данном примере нужно дожидаться асинхронную операцию?

Есть следующий пример из документации буста, подскажите для чего в методе receive используется вот эта строка?
do io_service_.run_one(); while (ec == boost::asio::error::would_block);

Я не понимаю в чем суть такой идеи.
  • Вопрос задан
  • 33 просмотра
Пригласить эксперта
Ответы на вопрос 1
В этом же примере всё и написано, чуть выше. Цитирую:
// Set up the variables that receive the result of the asynchronous
// operation. The error code is set to would_block to signal that the
// operation is incomplete. Asio guarantees that its asynchronous
// operations will never fail with would_block, so any other value in
// ec indicates completion.
ec = boost::asio::error::would_block;
std::size_t length = 0;

Обратите внимание на "so any other value in ec indicates completion". Нам показывают, что начальное значение ec выставляется в would_block и используется как маркер того, что мы ЕЩЁ ничего не записали в переменную ec в обработчике handle_receive. Иными словами, как маркер того, что handle_receive ещё не выполнился. Когда выполнится - то, согласно интерфейсу Asio, в него прилетит что-либо, отличное от would_block, что и будет им записано в ec. Это и будет условием выхода из цикла.

Цикл здесь организован, чтобы дождаться выполнения конкретно асинхронной операции чтения.
Вам может показаться, что асинхронная операция здесь запускается только одна, но это не так, ведь есть ещё срабатывание таймера deadline_. Из чего можно заключить, что каждый вызов run_once может запустить либо обработчик handle_receive, либо check_deadline (напомню, что run_once прокачивает только один вызов какого-либо обработчика в очереди).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы