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

时间:2017-07-27 19:40:47

标签: c++ c++11 future

我理解什么是std :: future但我不明白何时以及如何使用std :: shared_future和std :: promise,我无法在网上找到一个好的解释。

我会很感激帮助我的头脑。

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

1 个答案:

答案 0 :(得分:8)

std::shared_future当您需要拥有std::future的{​​{1}}个可能的多个消费者的多个有效副本时。

您可以将std::future移动到std::future

std::shared_futurestd::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有两个字段 - promise_pipe<int>std::future<int> out

当且仅当您使用std::function<void(int)> in致电out时,in的未来才会准备就绪。

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

当位图完全到达时,您只需执行in,并且等待in(Bitmap)的任何人都会收到通知。

future是旨在允许程序员生成自己的promise的对象,而不仅仅是使用future库创建的对象。

现在std通常比packaged_task更容易使用,并且具有相同的用途。