Boost.Asio:异步操作挂起时,超时处理后是否保证触发回调?
异步操作超时处理的回调触发问题
针对你描述的超时处理方案,不同类型的挂起异步操作触发回调的情况可以明确如下:
异步解析(async_resolve):调用
resolver.cancel()后,所有挂起的解析操作都会立即触发对应的回调,回调会收到boost::asio::error::operation_aborted错误码,这个行为是完全有保证的。socket相关异步操作(async_connect、async_write、async_read_some):
- 执行
socket.shutdown()时,挂起的读写操作会被唤醒,回调会收到对应错误(比如boost::asio::error::shut_down),但shutdown仅关闭socket的读写通道,不会直接终止正在进行的connect操作。 - 执行
socket.close()时,所有关联到该socket的挂起异步操作都会被强制取消,对应的回调一定会被触发,携带的错误码通常是boost::asio::error::operation_aborted或平台相关的错误(比如boost::asio::error::bad_descriptor)。
- 执行
需要额外注意:
- 要保证定时器回调和所有异步操作的回调都在同一个
io_context的线程中执行,避免竞态条件导致部分回调无法正常触发。 - 操作顺序建议先调用
resolver.cancel()(如果存在挂起的解析操作),再执行socket的shutdown和close,避免资源释放顺序问题引发异常。
内容的提问来源于stack exchange,提问作者equipped_mandingo
相关产品推荐
相关产品推荐

