提升asio io_service.run()

时间:2009-12-30 21:30:21

标签: c++ boost boost-asio

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

  

run()函数会阻塞,直到所有工作完成且没有   更多处理程序要派遣,或直到io_service为止   停止。多个线程可以调用run()函数来设置a   io_service可以从中执行处理程序的线程池。所有   在池中等待的线程是等效的和io_service   可以选择其中任何一个来调用处理程序。 run()函数   只有在打电话完成后才可以安全地再次呼叫   复位()。

它表示run函数将返回,并且我假设当它确实返回时,网络线程会停止,直到再次调用它为止。如果这是真的,那么为什么不在循环中调用run函数,或者至少给出自己的线程? io_service.run()函数对我来说几乎是一个谜。

1 个答案:

答案 0 :(得分:19)

“直到所有工作完成并且没有更多的处理程序被派遣,或者直到io_service被停止”

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

基本上,当你在一个线程中运行io_service.run时,io_services proactor使用你安装的处理程序接管程序流程。从那时起,您将根据事件(如handle_accept)而不是正常的程序程序流来处理程序。你提到的循环位于asio的主要深度的某个深处; - )。