io_service::reset
documentation说明在reset()
,run()
,run_one()
或poll()
的后续调用之前必须先调用poll_one()
问题:
assert
,为什么这个要求不够重要?某些上下文:我完成了一些单元测试的调试,这些单元测试在没有poll()
的情况下反复检查了reset()
,并试图检查每次执行的预期处理程序数。似乎有足够的poll()
调用,所有处理程序最终都按预期的顺序执行,但它需要的调用次数比您预期的要多。正确调用reset()
可以解决问题,但我很想知道这是否是不调用reset()
的唯一副作用,或者是否有可能出现更糟糕的影响,例如丢弃处理程序或可能出现的效果在一个多线程的例子中。
答案 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_service
为io_service.stopped()
,则对true
,poll()
,poll_one()
和run()
的后续调用将不会执行任何工作。
为什么这个要求不够重要,以保证断言是否被忽略了?
io_service::reset()
文档对“必须”一词的使用倾向于设置过于严格的语气而不提及不调用run_one()
的后果。 io_service::stop()
描述的行为不足以保证错误:
对
reset()
,run()
,run_one()
或poll()
的后续调用将立即返回,直到poll_one()
被调用。
对于reset()
,唯一的硬性要求是在未完成对reset()
,poll()
,poll_one()
和run()
的调用时调用它。