gpt4 book ai didi

c++ - 在 stop() 之后清除 boost::asio::io_service

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:45 30 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

请考虑:

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

关于c++ - 在 stop() 之后清除 boost::asio::io_service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18553886/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com