我理解什么是std :: future但我不明白何时以及如何使用std :: shared_future和std :: promise,我无法在网上找到一个好的解释。
我会很感激帮助我的头脑。
顺便说一下,这里的例子并不清楚http://en.cppreference.com/w/cpp/thread/shared_future
答案 0 :(得分:8)
std::shared_future
当您需要拥有std::future
的{{1}}个可能的多个消费者的多个有效副本时。
您可以将std::future
移动到std::future
。
将std::shared_future
:std::future
视为std::shared_future
:std::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
更容易使用,并且具有相同的用途。