有效期货与违约构造期货

时间:2016-10-31 14:19:18

标签: c++ validation future concurrent.futures futuretask

我正在我的并发编程课中学习期货。我的教授在她的幻灯片中说明了这一点:

"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
  

未来的对象只在它们有用时才有用   是有效的。默认构造的未来对象是   不是有效的(除非移动分配一个有效的未来)。

我无法理解上述的含义,特别是“除非移动指定有效的未来”部分。有人可以用简单的术语解释一下,也许还会显示一些示例代码吗?

1 个答案:

答案 0 :(得分:6)

std::future constructor中所述:

  

默认构造的未来对象无效

这只是意味着调用对象的默认构造函数,如:

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()后将falsethis.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() == trueother.valid()之前调用true的移动构造函数将导致View <{1}}。否则为假。