stop()后清除boost :: asio :: io_service

时间:2013-08-31 23:50:58

标签: c++ boost boost-asio

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

然而,看起来处理程序仍然在队列中,因此调用io_service.reset()以及稍后io_service.run()会使旧处理程序重新启动。 任何人都可以确认即使在调用io_service.stop()之后处理程序确实仍然在队列中。如果是这样,那么完全重置io_service的可能性有多大,例如:删除所有排队的处理程序?

1 个答案:

答案 0 :(得分:7)

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

io_service的{​​{3}}将导致所有未处理的处理程序被销毁:

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

考虑:

  • 控制io_service对象的生命周期。可以在destructor回答中找到一种方法。
  • 运行io_service完成。这通常需要设置状态,取消未完成的操作,并阻止完成处理程序将其他工作发布到io_service。 Boost.Asio提供了一个正式的Service示例,并且还显示了运行到io_service完成的超时方法this