7

我正在使用(单线程)aboost::asio:io_service来处理大量 tcp 连接。对于每个连接,我使用一个deadline_timer 来捕获超时。如果任何一个连接超时,我就不能使用其他连接的任何结果。因此我想完全重新启动我的 io_service。我认为调用io_service.stop()将允许调用队列中的“已完成”处理程序,并且会调用队列中的处理程序并出现错误。

但是,处理程序似乎保留在队列中,因此调用io_service.reset()并稍后io_service.run()恢复旧的处理程序。任何人都可以确认处理程序确实保留在队列中,即使在io_service.stop()被调用后也是如此。如果是这样,完全重置 io_service 的可能性是什么,例如删除所有排队的处理程序?

4

1 回答 1

10

io_service::stop() 并且io_service::reset() 只控制 的io_service事件循环的状态;不会影响为延迟调用(准备运行)或用户定义的处理程序对象安排的处理程序的生命周期。

析构函数io_service导致所有未完成的处理程序被销毁:

  • 与 关联的每个服务对象io_service都将调用其shutdown_service()成员函数。根据服务类型要求,shutdown_service()成员函数将销毁服务持有的用户定义处理程序对象的所有副本。
  • 为延迟调用安排的未调用处理程序对象被销毁io_service及其任何链。

考虑:

  • 控制io_service对象的寿命。在这个答案中可以找到一种方法。
  • 运行io_service完成。这通常需要设置状态,取消未完成的操作,并防止完成处理程序将额外的工作发布到io_service. Boost.Asio 提供了一个官方的超时示例,这里io_service也展示了一个运行到完成的超时方法。
于 2013-09-01T04:57:15.763 回答