【问题标题】:What is the definition of a boost::asio::io_service ready handler?boost::asio::io_service 就绪处理程序的定义是什么?
【发布时间】:2018-01-15 16:50:51
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

标签: c++ boost boost-asio


【解决方案1】:

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

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

另见Boost::Asio : io_service.run() vs poll() or how do I integrate boost::asio in mainloop

【讨论】:

    【解决方案2】:
    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();,此调用将阻塞,直到计时器完成并执行处理程序。

    【讨论】:

    • 我赞成你和 Arne Mertz 的回答,他们都非常有说服力并且同样很好地解释了这个词。由于代码示例,我接受了您的回答。感谢您的努力。
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2014-02-08
    • 2017-09-17
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多