微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

异步和承诺 - 这是正确的用法吗?

如何解决异步和承诺 - 这是正确的用法吗?

我正在学习多线程,我发现了一个困扰我的例子。 (我不是此代码的作者)。

#include <iostream>
#include <future>
using namespace std;

void testFunc(std::promise<int> &result,std::promise<bool> &done)
{
    // other... 

    result.set_value(10);           
    done.set_value(true); 

    // other.... 
}

int main()
{

    std::promise<int>       resultPromise;
    std::promise<bool>      donePromise;

    std::future<int>    resultFuture = resultPromise.get_future();
    std::future<bool>   doneFuture = donePromise.get_future();

    std::async(std::launch::async,testFunc,std::ref(resultPromise),std::ref(donePromise) );    // line A

    bool done = doneFuture.get();                   // line B
    int result_testFunc = resultFuture.get();       // line C

    // do other things with result_testFunc

    return 0;
}

在我看来,使用 future 返回的 async 会更容易。我们可以在 testFunc() 中返回值,然后在提到的 get() 上使用 future。我们不需要创建 resultPromisedonePromise

  1. 以上代码段是否正确使用了 futurepromise? (理论上)
  2. 在 B 行调用get() 是否会阻塞,直到线程函数 testFunc() 完成并退出

解决方法

对于这个例子,在提供给 std::async 的 lambda 中返回一个值肯定更有意义。

一般来说,futures 和 promises 旨在促进异步编程。通常应该避免或至少减少等待的地方。

为了避免完全等待,您可以使用实验性的 std::future::then 分配一个延续函数来处理第一个 lambda 的结果。

或者,您可以使用 co_await,它基本上以更易读的语法包装 std::future::then 行为。但在我看来,如果您首先对 std::future::then 机制有充分的了解会更好。

为了减少等待,您可以利用发布线程(主线程)在异步任务在后台运行时做一些有用的事情。

请注意,co_await 对 C++ 来说是全新的,并且仅在某些编译器上受支持。
std::future::then 仍处于实验阶段,但至少在 msvc 上可用。

至于您的具体问题:

上面的代码片段是否正确使用了 future 和 promise? (在 理论)

代码可以工作,但使用模式并不如所解释的那样理想。

将在 B 行调用的 get() 阻塞直到线程函数 testFunc() 已经完成并退出?

是的。它将阻塞,直到 testFunc 在后台线程上完成其工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。