gpt4 book ai didi

C++ 异步编程

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:25 32 4
gpt4 key购买 nike

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

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

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

任何建议都是有帮助的。

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

最佳答案

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

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

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

请参阅下面的示例。

// 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
*/
}

关于C++ 异步编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36023244/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com