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

dar*_*ts 4 c++ future c++11

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

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

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

Yak*_*ont 8

std::shared_future当你需要拥有a的多个有效副本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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个玩具的例子std::promise,我拿了一个T,我std::future<T>从中产生了一个已经准备就绪.

如果您的代码可能需要线程关闭,或者可能已经计算过,则可以从中返回std::future<T>.如果未计算,则返回std::async( ... )呼叫结果.如果已经计算,则返回a 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 = {};
    };
  }
};
Run Code Online (Sandbox Code Playgroud)

我在这里写了一篇promise_pipe.

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

out未来,当且仅当您的通话将被随时inint.

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

当位图完全到达时,您只需要做in(Bitmap)任何等待future通知的人.


promises是旨在允许程序员生成自己的futures的对象,而不仅仅是使用std库创建的对象.

现在a packaged_task通常比a更容易使用std::promise,并且服务于相同的目的.