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

Haa*_*hii 6 c++ boost boost-asio

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

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

Tan*_*ury 9

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

析构函数用于io_service将导致所有优秀的处理程序被破坏:

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

考虑:

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