如何理解“ std :: future共享状态”?

时间:2020-06-07 05:30:46

标签: c++ c++11

根据文档(http://www.cplusplus.com/reference/future/future/get/),其中指出: [强调我的]

共享状态就绪后,该函数将取消阻止并返回(或 引发)释放其共享状态。这使得未来的对象没有 有效期更长:此成员函数最多应被调用一次 每个未来共享状态

根据文档(http://www.cplusplus.com/reference/future/future/),其中指出: [强调我的]

“有效”期货是与共享状态相关联的期货对象,并且 通过调用以下函数之一来构造

异步

promise :: get_future

packaged_task :: get_future

根据文档(http://www.cplusplus.com/reference/future/future/get/),其中指出: [强调我的]

std :: future :: get

通用模板(1)T get();参考

专业化(2)R&future :: get(); //当T为参考

类型(R&)无效的专业化(3)无效的future :: get(); //当T为空

返回:

值通常(1),std :: move(x),其中x是在共享状态中存储的值。

对于引用(2),是对以共享状态存储的值的引用。

对于无效期货(3),什么也没有。

我的问题是什么是“ std::future共享状态”?我如何理解“ std :: future共享状态”?

我是C ++的新手。尽管我对此进行了思考和思考,但是我仍然无法理解这个想法。对于这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

根据std::future上的cppreference文档:

当异步操作准备好将结果发送给创建者时,它可以通过修改链接到创建者std :: future的共享状态(例如std :: promise :: set_value)来实现。

这里的共享状态是指一些可变的东西,可由多线程读取/写入。直接从文档中考虑示例:

std::promise<int> p;
std::future<int> f = p.get_future();
std::thread([&p]{ p.set_value_at_thread_exit(9); }).detach();
f.wait();

主线程和创建的线程共享p(并且由于p是有状态的,它们共享状态!)。在lambda主体内调用std::promise::set_value_at_thread_exit可以有效地修改这两个线程之间的共享状态。这本质上就是全部。

promise提供的std::future是共享状态“有趣”部分的表示,即您关心的价值。