我在理解诺言如何与未来合作方面存在问题。
我有一个返回std::future
的函数,例如以下示例:
std::future<int> calcSomeValue() {
}
我的问题是,可以通过异步生成线程来计算此未来,或者可以已经准备好返回结果,因此我想使用std::promise
将其返回而不运行线程。但是...我不知道这是否安全或者我还能做什么。
参见示例:
std::future<int> calcSomeValue() {
if (resultIsReady()) {
std::promise<int> promise; // on the stack
std::future<int> rv = promise.get_future(); // is future part of the memory occupied by promise?
promise.set_value(resultThatIsReady); // does it store the value in promise or in future?
return rv; // <--- What will happen when promise is lost?
}
else {
return std::async(....)
}
}
请参阅上面代码中的注释。
调用.get()
且已实现诺言的将来访问诺言变量吗?如果是这样的话,我在这里会有一个大的斗。
在这种情况下,谁能告诉我如何退回std::future
?
答案 0 :(得分:3)
promise
对象与共享状态关联(请注意“共享”)。调用promise::get_future
时,您将收到一个future
-对象,该对象与与各自的Promise对象相关联的共享状态相同。该状态的生存时间至少与一个关联的生产者(即承诺)或消费者(即未来)的寿命相同。因此,promise
的生命周期是否在相应的future
对象之前结束并不重要。
不是规范性的,但例如,参见cplusplus.com中所述的promise:
共享状态的生存期至少持续到最后一个对象为止 与之关联的对象会释放它或将其销毁。因此它 如果最初获得它的诺言对象可以生存 也与未来相关。