5

我试图了解 io_service 的 poll()/poll_one() 和 run()/run_one() 之间的区别。文档中所述的区别在于 poll() 执行准备好的处理程序,而不是 run() 执行任何处理程序。

但是在 boost 文档中,我找不到“就绪处理程序”的定义。

这个问题的一个有效答案是能够展示(最好是通过代码示例)就绪和非就绪处理程序之间的区别以及 poll() 和 run() 执行它的方式之间的区别。

谢谢。

4

2 回答 2

11

“就绪处理程序”是准备好执行的处理程序。如果您发出了异步调用,它将在后台执行,并且在异步调用完成时其处理程序准备就绪。在此之前,处理程序处于挂起状态,但尚未准备好。

  • poll_one如果有,则执行一个就绪处理程序。
  • poll执行所有准备好的处理程序,但不执行待处理的处理程序。两个轮询版本在处理程序执行后立即返回。
  • run_one如果有一个准备好的处理程序,则执行一个准备好的处理程序,如果没有,它会等待第一个待处理的处理程序准备好,这意味着它会阻塞。
  • run执行并等待,直到既没有准备好也没有待处理的处理程序。返回后,io_servie 处于停止状态。

另请参阅Boost::Asio : io_service.run() 与 poll() 或如何在 mainloop 中集成 boost::asio

于 2013-01-29T08:31:31.950 回答
6
int main()
{
    boost::asio::io_service io_service;
    boost::asio::deadline_timer timer(io_service);

    timer.expires_from_now(boost::posix_time::seconds(5));
    timer.async_wait([](const boost::system::error_code& err)
                     { std::cout << (err ? "error" : "okay")
                     ;});

    //io_service.poll_one(); 
    io_service.run_one();
}

如果您使用io_service.poll_one();,您很可能看不到任何输出,因为计时器尚未结束。ready handler简单地表示准备运行的句柄(例如当计时器经过或操作完成时等)。但是,如果您使用 io_service.run_one();此调用将阻塞,直到计时器完成并执行处理程序。

于 2013-01-29T08:49:11.497 回答