C ++异步编程

时间:2016-03-15 22:12:40

标签: c++ c++11 asynchronous

我编写了一个小型同步C ++应用程序。 我已经达到了我需要调用一些异步运行的API,在结果可用时调用一些注册的回调的地步。 我遇到的问题是同步部分取决于来自异步调用的结果。

混合同步和异步代码时使用的最佳推荐方法是什么?

进一步解释。我想调用异步api,捕获结果,然后继续我的main(...)中的代码。

任何建议都有帮助。

我一直在考虑使用状态机。这是推荐的吗?

3 个答案:

答案 0 :(得分:3)

如果您使用的某些第三方API已经实现了异步作业,那么您所要做的就是遵循他们的规则。新的C ++ 11异步线程的东西,如std :: future / std :: promise将无济于事,因为你不需要在单独的线程中调用自己的任务,但你需要的是使用你的结果接收由该API异步提供给您当前的线程。

如果API没有同步操作选项,那么您必须以异步方式使用它。当您到达进行异步调用的位置时,如果需要有结果继续工作,那么您所能做的就是将回调处理程序作为回调参数放到该API异步调用中。在C ++ 11中,您可以使用lambda作为回调处理程序。在这种情况下,您只需将代码剪切并粘贴到API调用的下方,因为它曾经是同步的。

该异步API提供的某些事件循环必须在某处无限运行,以确保您的工作线程处于活动状态并可以调用异步回调。例如,在boost :: asio中,它是io_service.run(),并且回调通过io_service.post(回调)发送回您的工作线程。

见下面的例子。

// legacy code when you worked with sync API
void syncProcess()
{
   // code before call

   ResultType callResult=syncAPI.call(args);

   // code after call
}

// now you have async API
void asyncProcess()
{
   // code before call

   asyncAPI.call(args,
        [=](ResultType callResult)
        {
           // code after call
        }
   );

   /* the event loop can be here
    for example, it can be boost::asio::io_service::run() in case you're using boost::asio
   or something similar that keeps your main working thread alive and not locked
    if you use third party async API it must provide the event loop where async callbacks are invoked
  */
}

答案 1 :(得分:2)

我认为期货最适合您的需求。 请查看cplusplus.com以获取更多信息。如果您需要一些代码示例,请不要犹豫,在评论中提问。

答案 2 :(得分:2)

我会创建一个condition variable和一个atomic bool。 执行API调用并检查bool是否为真(如果是,则不能等待通知),如果没有,则等待条件变量。 在回调中,您必须设置bool并通知条件变量。

等待条件变量当然也需要一个互斥锁。

相关问题