Мой код использует boost::asio и io_service в одном потоке для выполнения различных операций с сокетами. Все операции асинхронны, и каждый обработчик зависит от boost::system::error_code
(в частности, boost::asio::error::operation_aborted
) для определения результата операции.
Работает отлично ну пока я не изменил логику сделать несколько concurrentподключений и выбрать самое быстрое, то есть при срабатывании первого async_read_some
обработчика я отменяю остальные сокеты (shutdown, close - все) и продолжайте с текущим.В 95% случаев обработчики чтения других сокетов вызываются с ошибкой operation_aborted. Однако иногда эти обработчики чтения вызываются без ошибок, сообщая мне, что они успешно получили N байтов.
Но документация для socket::cancel() гласит:
Эта функция вызывает все незавершенные асинхронные соединения, отправку и получать операции для немедленного завершения, а обработчики для отмененные операции будут переданы с ошибкой
boost::asio::error::operation_aborted
.
Итак, вопросы: Могу ли я действительно полагаться на ошибку operation_aborted
в производственном коде? Если можно, это баг в Asio от boost 1.46.1? Если я не могу, есть ли какая-либо официальная документация по этому поводу?