首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++异步编程

C++异步编程
EN

Stack Overflow用户
提问于 2016-03-16 06:12:40
回答 3查看 5.7K关注 0票数 2

我已经编写了一个小型同步C++应用程序。我需要调用一些异步运行的API,当结果可用时调用一些已注册的回调函数。我遇到的问题是,同步部分依赖于异步调用的结果。

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

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

任何建议都是有帮助的。

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

EN

回答 3

Stack Overflow用户

发布于 2016-03-16 07:06:05

如果您使用的是已经实现异步作业的第三方API,那么您所要做的就是遵循它们的规则。像std::future/std::promise这样的新的C++11异步线程不会有帮助,因为您不需要在单独的线程中调用您自己的任务,但您需要的是处理由该API异步提供给当前线程的结果。

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

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

请参见下面的示例。

代码语言:javascript
复制
// 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
  */
}
票数 4
EN

Stack Overflow用户

发布于 2016-03-16 06:21:44

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

票数 2
EN

Stack Overflow用户

发布于 2016-03-16 07:18:40

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36023244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档