2009-12-30 213 views
14

我刚刚通过asio chat server example。我的问题是关于他们对io_service.run()函数的使用。对于io_service.run()函数的文档说:boost asio io_service.run()

的run()函数阻塞,直到所有的工作已经完成,并且没有 更多的处理程序被分派,或直至io_service对象已经 停止。多个线程可能会调用run()函数来设置一个线程池,io_service可以从中执行处理程序。在池中等待的所有 线程都是等效的,并且io_service 可以选择其中任何一个来调用处理程序。只有在调用 reset()后,才能安全地调用run()函数 。

它说,run函数将返回,和我假设,当它返回的网线停止,直到再次被调用。如果那是真的,那么为什么不是循环中调用的运行函数,或者至少给它自己的线程? io_service.run()函数对我来说是非常神秘的。

+0

检查还答案在这里: http://stackoverflow.com/questions/4705411/boostasio-io-service-run-vs-poll-or-how-do-i-integrate-boostasio-in -ma – serxio 2014-02-04 14:26:21

回答

19

“直到所有的工作已经完成,并没有更多的处理程序被分派,或直至io_service对象已经停止”

请注意,您DO安装一个处理器,命名为handle_accept,在每个重新安装本身执行。因此,io_service.run将永远不会返回,至少在您手动退出之前。

基本上,目前在线程中运行io_service.run,io_services proactor使用您安装的处理程序接管程序流程。从这一点开始,您将基于事件(如handle_accept)而不是正常的程序流程来处理程序。你提到的循环处于asio的proactor的可怕深处深处;-)。

+0

老问题,希望我会在这里得到答复,因为这看起来相关。没有接受处理程序的客户情况如何?我试图用asio编写一个客户端,并且陷入了io_service.run()适合的问题。 – Endophage 2011-11-12 06:11:02

+0

@Endophage,对不起,我使用boost :: asio已经很长时间了,所以我找不到来自我头顶的答案,请尝试重新提问。 – 2011-11-16 00:38:57

+0

没问题,谢谢你的回旋。 – Endophage 2011-11-16 17:58:05

相关问题