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

Zer*_*ero 4 boost-asio

io_service::reset 文件指出,reset()必须后续调用之前被调用run(),run_one(),poll()poll_one().

问题:

  • 为什么这有必要? -
  • 如果忽略这一步,我会期待什么样的行为?
  • 为什么这个要求不够重要,无法保证assert它是否被忽略了?

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

Tan*_*ury 7

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().