boost :: asio :: io_service ready handler的定义是什么?

Edd*_*tes 5 c++ boost boost-asio

我试图理解io_service的poll()/ poll_one()和run()/ run_one()之间的区别.文档中陈述的差异是poll()执行就绪处理程序而不是执行任何处理程序的run().

但是在boost文档中我找不到"就绪处理程序"的定义.

这个问题的一个有效答案是能够最好地用代码示例显示就绪和非就绪处理程序之间的区别以及poll()和run()如何执行它之间的区别.

谢谢.

Arn*_*rtz 11

"就绪处理程序"是准备执行的处理程序.如果您已发出异步调用,它将在后台执行,并在异步调用完成后其处理程序就绪.在此之前,处理程序正在等待,但尚未就绪.

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

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


Jes*_*ood 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();
}
Run Code Online (Sandbox Code Playgroud)

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