【问题标题】:Clear boost::asio::io_service after stop()在 stop() 之后清除 boost::asio::io_service
【发布时间】:2013-08-31 23:50:58
【问题描述】:

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

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

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

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

    io_servicedestructor 将导致所有未完成的处理程序被销毁:

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

    考虑:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2017-09-17
      • 2012-11-26
      • 2011-12-18
      • 2016-01-07
      相关资源
      最近更新 更多