Я изучаю фьючерсы в моем классе параллельного программирования. Мой профессор заявил об этом в своих слайдах:
"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
будущие объекты полезны только тогда, когда они
являются действительными. Построенные по умолчанию будущие объекты
не действует (если шаг-не назначен действительное будущее).
Я не могу понять значение вышесказанного, особенно часть «если не назначено правильное будущее». Может ли кто-нибудь объяснить это простыми словами и, возможно, показать пример кода?
Как указано в std::future
конструктор:
Построенные по умолчанию объекты будущего недопустимы
Это просто означает вызов конструктора по умолчанию для объекта, что-то вроде:
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
прежде чем двигаться от него. Ложно иначе.
Других решений пока нет …