2016-12-08 2 views
1

Say есть отложенная асинхронная операция с обработчиком завершения обернута нитью, когда она аннулирована - например, путем закрытия сокета, отменяя таймер и т.д.Выполняют ли обработчики завершения ASIO через цепочку для отмененных операций?

Так, как я это вижу, обработчики завершения будет помещёны с кодом ошибки operation_aborted. Теперь их можно удалить из-за io_service, которые будут отправлены.

Правильно ли я рассказываю эту историю? Если да, то когда io_service вызывает обработчик завершения, выполняется ли он через цепочку, даже если они являются результатом отмененных операций?

ответ

4

Да, абсолютно. Это инвариант, который завершает каждая запущенная асинхронная операция. Независимо от кода ошибки или успеха, обработчик завершения выполняется таким же образом - если он привязан к цепочке, обработчик будет выполняться на цепочке.

Обычно вам не нужно ничего делать в этом случае, и обработчик просто проверяет наличие operation_aborted и return s. Но если вы хотите что-то сделать, вы можете. Кроме того, разрушение объекта обратного вызова может привести к тому, что все произойдет. Например, если вызов обработчика завершения был через shared_ptr, уничтожение этого shared_ptr может инициировать запуск других деструкторов.

Смежные вопросы