加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:07:21 所属栏目:百科 来源:网络整理
导读:我明白什么是std :: future但是我不明白何时以及如何使用std :: shared_future和std :: promise,我在网上找不到一个好的解释. 我会很感激帮助我的头脑. 顺便说一下这里的例子并不是很清楚http://en.cppreference.com/w/cpp/thread/shared_future 解决方法 st
我明白什么是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_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(计算值).

一个稍微复杂的情况:

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)>在.

当且仅当您使用int调用时,未来将会准备就绪.

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

当位图完全到达时,你只需进入(位图),任何人都在等待将来通知.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读