我正在我的并发编程课中学习期货。我的教授在她的幻灯片中说明了这一点:
"Valid" futures are future objects associated to a
shared state, and are constructed by calling one of the following functions:
async
promise::get_future
packaged_task::get_future
未来的对象只在它们有用时才有用 是有效的。默认构造的未来对象是 不是有效的(除非移动分配一个有效的未来)。
我无法理解上述的含义,特别是“除非移动指定有效的未来”部分。有人可以用简单的术语解释一下,也许还会显示一些示例代码吗?
答案 0 :(得分:6)
默认构造的未来对象无效
这只是意味着调用对象的默认构造函数,如:
std::future<int> f;
这将调用构造函数#1,其中指出:
默认构造函数。构造一个没有共享状态的std :: future。 施工后
valid() == false
。
至于另一部分:
(除非移动指定有效的未来)
这里的含义是将调用移动构造函数(future( future&& other )
#2):
移动构造函数。使用共享状态构造一个std :: future 其他使用移动语义。施工结束后,
other.valid() == false
。
基本上,此构造函数中other
的状态是移动到this
。这意味着,如果other.valid() == true
移动构造函数返回other.valid()
后将false
,this.valid()
将为true
。如果other.valid()
开始为false
,则两者都会以false
结束。
std::future<int> fut; // fut.valid() == false, default constructor
std::future<int> valid_fut = std::async(std::launch::async, [](){ return 42; }); // obtain a valid std::future..
// valid_fut.valid() == true here
//now move valid_fut into new_fut
std::future<int> new_fut(std::move(valid_fut));
// new_fut.valid() == true
// valid_fut.valid() == false
总结:
调用std::future
的默认构造函数将导致valid() == false
。总是
如果std::future
valid() == true
为other.valid()
之前调用true
的移动构造函数将导致View
<{1}}。否则为假。