我正在使用(单线程)boost::asio:io_service
来处理大量的tcp连接。对于每个连接,我使用deadline_timer来捕获超时。如果任何连接超时,我可以不使用其他连接的结果。因此,我想完全重启我的io_service。我认为调用io_service.stop()
将允许调用队列中的“已完成”处理程序,并且会在队列中调用处理程序并显示错误。
然而,看起来处理程序仍然在队列中,因此调用io_service.reset()
以及稍后io_service.run()
会使旧处理程序重新启动。
任何人都可以确认即使在调用io_service.stop()
之后处理程序确实仍然在队列中。如果是这样,那么完全重置io_service的可能性有多大,例如:删除所有排队的处理程序?
答案 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。