0

我试图了解启动 io_serviceio_service::run()与我的应用程序中的第一个异步操作的正确顺序,例如,async_accept. 大多数 boost 示例似乎首先执行后者,不知道为什么。

boost 文档说明了以下几点:

您的程序必须调用 io_service::run() 才能检索结果。当有未完成的异步操作时,对 io_service::run() 的调用会阻塞,因此您通常会在开始第一个异步操作后立即调用它。

我从图中了解到,异步操作的结果通过队列传递给 io_service,除非 io_service 已经在运行,否则它不会从该队列中获取结果。所以说 io_service 应该总是首先启动是不是正确的。该文档似乎另有暗示。有人可以解释一下吗?

4

1 回答 1

2

像这样的异步操作async_accept将在操作系统中启动异步任务,这会将结果(一旦可用)放入io_service的事件队列中。

io_service::run将轮询队列以获取结果并调用传递这些结果的处理程序。

当您没有异步任务时,没有要获取的结果,io_service也没有可能产生任何结果的未完成工作,所以它只是返回。

所以,你想要的顺序是:

  • 启动至少一个异步任务
  • 调用io_service::run发起轮询

您甚至可以启动单个异步任务,该任务可能会启动整个任务,并且永远不会io_service耗尽工作要做。

于 2012-09-26T20:18:51.600 回答