gpt4 book ai didi

C++ 什么是 std::shared_future 和 std::promise

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:00 25 4
gpt4 key购买 nike

我了解什么是 std::future 但我不了解何时以及如何使用 std::shared_future 和 std::promise,而且我在网上找不到很好的解释。

我会很感激一些帮助我解决这个问题。

顺便说一句,这里的例子不是很清楚http://en.cppreference.com/w/cpp/thread/shared_future

最佳答案

std::shared_future当您需要拥有 std::future 的多个有效拷贝时,并且可能是上述 std::future 的多个消费者 .

您可以移动 std::future进入std::shared_future .

考虑 std::future : std::shared_futurestd::unique_ptr : std::shared_ptr .


std::promise是生成 std::future 的一种方法.

template<class T>
std::future<std::decay_t<T>> make_ready_future( T&& t ) {
std::promise<std::decay_t<T>> pr;
auto r = pr.get_future();
pr.set_value(std::forward<T>(t));
return r;
}

这是一个玩具示例 std::promise , 我在那里拍 T然后我生成一个已经准备好的 std::future<T>从它。

如果您的代码可能需要关闭线程,或者可能已经计算好了,您可以返回 std::future<T>从中。如果未计算,则返回 std::async( ... ) 的结果称呼。如果已经计算,则返回 make_ready_future( calculated value ) .

稍微复杂一点的情况:

template<class T>
struct promise_pipe {
std::future<T> out;
std::function<void(T)> in;
promise_pipe() {
auto pr = std::make_shared<std::promise<T>>();
out = pr->get_future();
in = [pr](T t)mutable{
if (pr) pr->set_value(std::forward<T>(t));
pr = {};
};
}
};

这里我写了一个promise_pipe .

A promise_pipe<int>有两个字段 -- std::future<int> out和一个 std::function<void(int)> in .

out当且仅当您调用 in 时, future 才会准备就绪用int .

所以你可以有一个返回 std::future<Bitmap> 的函数.您有一些网络代码需要流式传输位图。所以你创建了一个 promise_pipe<Bitmap> , 返回 std::future<Bitmap>并存储 in在位图到达时出现在“待办事项”列表中。

当位图完全到达时,您只需执行 in(Bitmap)谁在等那个future将被通知。


promise s 是旨在让程序员生成自己的 future 的对象。 s,不只是使用由 std 创建的那些图书馆。

现在是 packaged_task通常比 std::promise 更容易使用, 并且与 promise_pipe 的用途大致相同多于。它是只移动的,所以你最终不得不把它包装成一个 std::shared_ptr和一个 std::function无论如何(或自定义移动std::function)

关于C++ 什么是 std::shared_future 和 std::promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45359660/

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