Асинхронные обработчики boost::asio вызываются без ошибок после отмены

Мой код использует 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? Если я не могу, есть ли какая-либо официальная документация по этому поводу?

5
задан Vladimir Sinenko 23 May 2012 в 11:10
поделиться