Действительные фьючерсы против фьючерсов, построенных по умолчанию

Я изучаю фьючерсы в моем классе параллельного программирования. Мой профессор заявил об этом в своих слайдах:

"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

будущие объекты полезны только тогда, когда они
являются действительными. Построенные по умолчанию будущие объекты
не действует (если шаг-не назначен действительное будущее).

Я не могу понять значение вышесказанного, особенно часть «если не назначено правильное будущее». Может ли кто-нибудь объяснить это простыми словами и, возможно, показать пример кода?

7

Решение

Как указано в 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 прежде чем двигаться от него. Ложно иначе.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector