You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:40:57