【问题标题】:boost asio io_service.run()提升 asio io_service.run()
【发布时间】:2009-12-30 21:30:21
【问题描述】:

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

run() 函数一直阻塞,直到所有工作完成并且没有 要调度更多的处理程序,或者直到 io_service 已经 停了下来。多个线程可能会调用 run() 函数来设置一个 io_service 可以从中执行处理程序的线程池。全部 在池中等待的线程是等效的,并且 io_service 可以选择其中任何一个来调用处理程序。运行()函数 只有在调用 重置()。

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

【问题讨论】:

标签: c++ boost boost-asio


【解决方案1】:

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

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

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

【讨论】:

  • 老问题,希望我能在这里得到答复,因为这似乎很相关。没有接受处理程序的客户端情况如何?我正在尝试用 asio 编写一个客户端,但我陷入了 io_service.run() 如何适应的问题。
  • @Endophage,很抱歉我很久没有使用 boost::asio,所以我无法从头顶找到答案,请尝试重新提问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多