async 和 promise - 这是正确的用法吗?

async and promise - is this correct usage?

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

#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;
}

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

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

对于此示例,return 提供给 std::async 的 lambda 中的值肯定更有意义。

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

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

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

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

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

关于您的具体问题:

Does above snippet presents proper usage of future and promise? (in theory)

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

Will get(), called on line B, block until the thread function testFunc() has completed and exited?

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