如何解决异步和承诺 - 这是正确的用法吗?
我正在学习多线程,我发现了一个困扰我的例子。 (我不是此代码的作者)。
#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
。我们不需要创建 resultPromise
和 donePromise
。
解决方法
对于这个例子,在提供给 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 举报,一经查实,本站将立刻删除。