为什么必须调用io_service :: reset()?

时间:2016-02-26 04:10:37

标签: boost-asio

io_service::reset documentation说明在reset()run()run_one()poll()的后续调用之前必须先调用poll_one()

问题:

  • 为什么这有必要? -
  • 如果忽略这一步,我会期待什么行为?
  • 如果忽视assert,为什么这个要求不够重要?

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

1 个答案:

答案 0 :(得分:6)

io_service停止时:

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

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

  

为什么这有必要?

如果run_one()已通过io_service.stop()明确停止或隐式失去工作,则有必要调用处理程序或处理事件循环。

  

如果忽略这一步,我会期待什么行为?

如果io_serviceio_service.stopped(),则对truepoll()poll_one()run()的后续调用将不会执行任何工作。

  

为什么这个要求不够重要,以保证断言是否被忽略了?

io_service::reset()文档对“必须”一词的使用倾向于设置过于严格的语气而不提及不调用run_one()的后果。 io_service::stop()描述的行为不足以保证错误:

  •   

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

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