14

我刚刚浏览了 asio聊天服务器示例。我的问题是关于他们对该io_service.run()功能的使用。该io_service.run()函数的文档说:

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

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

4

1 回答 1

19

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

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

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

于 2009-12-30T21:45:44.960 回答