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

C++ Boost::Asio:io_service.run()vs poll()或者如何在mainloop中集成Boost::Asio,c++,networking,tcp,boost-asio,C++,Networking,Tcp,Boost Asio,我目前第一次尝试使用boost::asio进行一些简单的tcp网络,我发现了一些我不确定如何处理的问题。据我所知,io_service.run()方法基本上是一个循环,它会一直运行到没有其他事情可做为止,这意味着它会一直运行到我释放我的小服务器对象为止。由于我allready设置了某种主循环,为了简单起见,我更愿意从那里手动更新网络循环,我认为io_service.poll()会做我想做的事情,有点像这样: void myApplication::update() { myIoServ

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

void myApplication::update()
{
     myIoService.poll();
     //do other stuff
}

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

使用
io_service::poll
而不是
io_service::run
是完全可以接受的。这一区别在下面的章节中进行了解释

也可以使用poll()函数 分派准备好的处理程序,但是 没有阻塞

请注意,
io_service::run
将阻止队列中是否还有剩余的内容

工作课是用来通知学生的 工作开始和结束时的io_服务 完成。这确保了 io_服务对象的run()函数 在工作进行期间不会退出, 它确实会在没有 剩余未完成的工作


然而,
io_service::poll
并没有表现出这种行为,它只是调用就绪处理程序。还请注意,您需要在任何后续调用
io_服务时调用:run
io_服务::poll

一个缺点是您将进行繁忙的循环

while(true) {
    myIoService.poll()
}
将使用100%的cpu
myIoService.run()
将使用0%的cpu


myIoService.run_one()
可能会执行您想要的操作,但如果无需执行任何操作,它将被阻止。

这样的循环可以让您进行轮询,不必忙着等待,并根据需要重置。(我正在使用较新的
io\u上下文
,它取代了
io\u服务


io\u服务
在返回
io\u服务::poll
后不一定停止。为什么需要在后续的
io\u服务::运行
io\u服务:轮询
?1+用于io\u服务::重置。如果
run
未找到任何工作,
\u stopped
被设置为
true
,这将阻止以后处理任何添加的任务
reset
设置
\u stopped
返回到
false
。您确实希望在这种简单的情况下运行,但在事件循环已经存在的情况下(比如它正在进行背景渲染或在空闲周期中进行其他操作),则首选轮询,因为您不希望每次run()阻塞时游戏都停止。
while (!exitCondition) {
    if (ioContext.stopped()) {
        ioContext.restart();
    }
    if (!ioContext.poll()) {
        if (stuffToDo) {
            doYourStuff();
        } else {
            std::this_thread::sleep_for(std::chrono::milliseconds(3));
        }
    }
}