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

mok*_*oka 32 c++ networking tcp boost-asio

我目前正在尝试首次使用boost :: asio进行一些简单的tcp网络,而且我已经发现了一些我不确定如何处理的东西.据我所知,io_service.run()方法基本上是一个循环,它运行直到没有其他事情要做,这意味着它将一直运行,直到我释放我的小服务器对象.由于我已经设置了某种主循环,我宁愿从那里手动更新网络循环只是为了简单起见,我认为io_service.poll()会做我想要的,有点像这样:

void myApplication::update()
{
     myIoService.poll();
     //do other stuff
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但我仍然想知道这种方法是否有缺点,因为这似乎不是处理boost :: asios io服务的常用方法.这是一种有效的方法还是我应该在非阻塞的额外线程中使用io_service.run()?

Sam*_*ler 41

使用io_service::poll而不是io_service::run完全可以接受.文档中解释了不同之处

poll()函数也可用于调度就绪处理程序,但不会阻塞.

请注意,io_service::run如果work队列中有任何剩余,将阻止

工作类用于在工作开始和结束时通知io_service.这可以确保io_service对象的run()函数在工作正在进行时不会退出,并且在没有剩余未完成的工作时它会退出.

虽然io_service::poll没有表现出这种行为,但它只是调用现成的处理程序.另请注意,您需要在任何后续调用或调用io_service :: reset时调用.io_service:runio_service::poll

  • 返回`io_service :: poll`后,`io_service`不一定停止.为什么在随后的`io_service :: run`或`io_service:poll`之前需要`io_service :: reset`? (11认同)