正确的启动异步操作的顺序和在boost :: asio中运行io_service?

时间:2012-09-26 20:15:43

标签: c++ asynchronous boost-asio

我正在尝试理解启动io_service io_service::run()与我的应用程序中第一个异步操作的正确顺序,例如async_accept。大多数提升示例似乎首先执行后者,不确定原因。

boost documentation提出以下观点:

  

您的程序必须调用io_service :: run()才能获得结果   检索。在有的情况下调用io_service :: run()块   未完成的异步操作,因此您通常将其称为   一旦你开始了第一次异步操作。

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

1 个答案:

答案 0 :(得分:2)

async_accept这样的异步操作将启动操作系统中的异步任务,它会将结果(尽快)放入io_service的事件队列中。

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

如果您没有异步任务,则无法获取io_service的结果,并且也没有可能产生任何结果的未完成的工作,因此它只会返回。

所以,你想要的顺序是:

  • 启动至少一个异步任务
  • 致电io_service::run以启动投票

您甚至可以启动单个异步任务,该任务可能会启动整个任务,并且永远不会让io_service用完工作。