我刚刚过了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()
函数对我来说几乎是一个谜。
答案 0 :(得分:19)
“直到所有工作完成并且没有更多的处理程序被派遣,或者直到io_service被停止”
请注意, DO 安装一个名为handle_accept
的处理程序,在每次执行时重新安装。因此,io_service.run
将永远不会返回,至少在您手动退出之前。
基本上,当你在一个线程中运行io_service.run时,io_services proactor使用你安装的处理程序接管程序流程。从那时起,您将根据事件(如handle_accept
)而不是正常的程序程序流来处理程序。你提到的循环位于asio的主要深度的某个深处; - )。