2016-02-26 99 views
2

io_service::resetdocumentation指出reset()必須後續調用run()run_one()poll()poll_one()之前被調用。爲什麼必須調用io_service :: reset()?

問題:

  • 爲什麼是這個必要嗎? -
  • 如果忽略此步驟,我可能會期望什麼行爲?
  • 爲什麼此要求不足以保證assert被忽視?

一些背景:我完成調試檢查調用poll()反覆無reset(),並試圖檢查正在每次執行處理程序的預期數量的一些單元測試。看起來有足夠的電話號碼給poll(),所有的處理程序最終都會按照預期的順序執行,但它會比你想象的要多得多。正確調用reset()可以解決這個問題,但我很想知道這是不是調用reset()的唯一副作用,或者是否存在潛在的更糟糕的效果,如可能出現在多線程示例中的處理程序或效果。

回答

2

io_service已經停止:儘快

  • 後續調用poll()

    • 所有的poll()poll_one()run()調用,以及run_one()將返回,poll_one()run()run_one()將返回立即不調用任何處理程序或處理事件循環

    調用io_service::reset()io_service設置爲不再處於停止狀態,允許對poll()poll_one()run()run_one()的後續調用調用處理程序並處理事件循環。


    Why is this necessary?

    這是必要的,如果一個人希望調用處理或處理事件循環一旦io_service已明確通過io_service.stop()運行失去工作的停止或暗示。

    What behaviour might I expect if this step is neglected?

    如果io_service.stopped()true,那麼後續調用poll()poll_one()run()run_one()不會執行任何工作。

    Why is this requirement not important enough to warrant an assert if it's neglected?

    io_service::reset()文檔的使用這個詞的「必須」傾向於設置一個過於重要音調不提不調用reset()的後果。通過io_service::stop()描述的行爲是不夠的關鍵,以保證一個錯誤:

    • Subsequent calls to run() , run_one() , poll() or poll_one() will return immediately until reset() is called.

    reset(),唯一的硬性要求是不會把它當有未完成的調用poll()poll_one()run() ,和run_one()

  • 相關問題