【问题标题】:Why must io_service::reset() be called?为什么必须调用 io_service::reset() ?
【发布时间】:2016-06-09 04:08:14
【问题描述】:

io_service::resetdocumentation 声明必须在后续调用run()run_one()poll()poll_one() 之前调用reset()

问题:

  • 为什么需要这样做? -
  • 如果忽略此步骤,我会期待什么行为?
  • 如果忽略此要求,为什么它不够重要,不足以保证 assert

一些上下文:我完成了一些单元测试的调试,这些单元测试在没有reset() 的情况下重复检查了调用poll(),并试图检查每次执行的处理程序的预期数量。似乎对poll() 进行了足够多的调用,所有处理程序最终都会按照预期的顺序执行,但它需要的调用比您预期的要多。正确调用reset() 可以解决问题,但我很想知道这是否是不调用reset() 的唯一副作用,或者是否存在潜在的更糟糕的影响,例如丢弃处理程序或可能出现在多线程中的效果线程示例。

【问题讨论】:

    标签: boost-asio


    【解决方案1】:

    io_service 已停止时:

    • poll()poll_one()run()run_one() 的所有调用将尽快返回
    • poll()poll_one()run()run_one() 的后续调用将立即返回,而无需调用任何处理程序或处理事件循环

    调用io_service::reset() 会将io_service 设置为不再处于停止状态,从而允许后续调用poll()poll_one()run()run_one() 来调用处理程序并处理事件循环。


    为什么需要这样做?

    如果希望在 io_service 已通过 io_service.stop() 显式停止或因工作耗尽而隐式停止后调用处理程序或处理事件循环,则这是必要的。

    如果忽略此步骤,我可能会出现什么行为?

    如果io_service.stopped()true,那么随后对poll()poll_one()run()run_one() 的调用将不会执行任何工作。

    如果忽略此要求,为什么它不够重要,不足以保证断言?

    io_service::reset() 文档对“必须”一词的使用往往会设置一种过于批判的语气,而没有提及不调用reset() 的后果。 io_service::stop() 描述的行为不够严重,不足以保证出错:

    • run()run_one()poll()poll_one() 的后续调用将立即返回,直到调用reset()

    对于reset(),唯一的硬性要求是在对poll()poll_one()run()run_one() 的未完成调用时不要调用它。

    【讨论】:

      猜你喜欢
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多