根据文档(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 ++的新手。尽管我对此进行了思考和思考,但是我仍然无法理解这个想法。对于这个问题,我将不胜感激。
答案 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
是共享状态“有趣”部分的表示,即您关心的价值。