33 Thread support library [thread]

33.6 Futures [futures]

33.6.7 Class template future [futures.unique_future]

Шаблон классаfuture определяет тип для асинхронных возвращаемых объектов, которые не разделяют свое общее состояние с другими асинхронными возвращаемыми объектами. Созданный по умолчаниюfuture объект не имеет общего состояния.future Объект с общим состоянием может быть создан с помощью функций наasynchronous providers или с помощью конструктора перемещения и разделяет его общее состояние с первоначальным асинхронным поставщиком. Результат (значение или исключение)future объекта может быть установлен путем вызова соответствующей функции для объекта, который имеет то же общее состояние.

[ Note: Функции-членыfuture не синхронизируются сами с собой или с функциями-членамиshared_­future. ]end note

Эффект вызова какой - либо функции - члена, кроме деструктора, оператор присваивания-ход,shareилиvalid наfuture объекте , для которого valid() == false не определено. [ Note: Действительно перейти от будущего объекта, для которогоvalid() == false. ] [ Реализациям рекомендуется обнаруживать этот случай и генерировать объект типа с условием ошибки . ]end noteNote: future_­error future_­errc​::​no_­stateend note

namespace std {
  template <class R>
  class future {
  public:
    future() noexcept;
    future(future&&) noexcept;
    future(const future& rhs) = delete;
    ~future();
    future& operator=(const future& rhs) = delete;
    future& operator=(future&&) noexcept;
    shared_future<R> share() noexcept;

    // retrieving the value
    see below get();

    // functions to check state
    bool valid() const noexcept;

    void wait() const;
    template <class Rep, class Period>
      future_status wait_for(const chrono::duration<Rep, Period>& rel_time) const;
    template <class Clock, class Duration>
      future_status wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
  };
}

Реализация должна предоставлять шаблонfuture и две специализации, future<R&> иfuture<​void>. Они отличаются только типом возвращаемого значения и возвращаемым значением функции-членаget, как указано в ее описании ниже.

future() noexcept;

Effects: Создаетempty future объект, который не относится к общему состоянию.

Postconditions:valid() == false.

future(future&& rhs) noexcept;

Effects: Move создаетfuture объект, который ссылается на общее состояние, на которое первоначально ссылалсяrhs (если таковой имеется).

Postconditions:

  • valid() возвращает то же значение, что иrhs.valid() до вызова конструктора.

  • rhs.valid() == false.

~future();

Effects:

  • Освобождает любое разделяемое состояние ([futures.state]);

  • разрушает*this.

future& operator=(future&& rhs) noexcept;

Effects:

  • Освобождает любое общее состояние ([futures.state]).

  • переместить Назначает содержимоеrhs в*this.

Postconditions:

  • valid() возвращает то же значение, что иrhs.valid() до присвоения.

  • rhs.valid() == false.

shared_future<R> share() noexcept;

Returns:shared_­future<R>(std​::​move(*this)).

Postconditions:valid() == false.

R future::get(); R& future<R&>::get(); void future<void>::get();

[ Note: Как описано выше, шаблон и две его требуемые специализации отличаются только типом возвращаемого значения и возвращаемым значением функции-членаget. ]end note

Effects:

  • wait()s, пока общее состояние не будет готово, затем извлекает значение, хранящееся в общем состоянии;

  • освобождает любое разделяемое состояние ([futures.state]).

Returns:

  • future​::​get() возвращает значение,v хранящееся в общем состоянии объекта как std​::​move(v).

  • future<R&>​::​get() возвращает ссылку, хранящуюся как значение в общем состоянии объекта.

  • future<void>​::​get() ничего не возвращает.

Throws: сохраненное исключение, если исключение было сохранено в общем состоянии.

Postconditions:valid() == false.

bool valid() const noexcept;

Returns:true только если*this относится к общему состоянию.

void wait() const;

Effects: Блокируется, пока не будет готово общее состояние.

template <class Rep, class Period> future_status wait_for(const chrono::duration<Rep, Period>& rel_time) const;

Effects: Нет, если общее состояние содержит отложенную функцию ([futures.async]), в противном случае блокируется, пока общее состояние не будет готово или пока не истечет относительный тайм-аут ([thread.req.timing]), указанный вrel_­time .

Returns:

  • future_­status​::​deferred если общее состояние содержит отложенную функцию.

  • future_­status​::​ready если общее состояние готово.

  • future_­status​::​timeout если функция возвращается из-за истечения относительного тайм-аута ([thread.req.timing]), указанного вrel_­time .

Throws: исключения, связанные с тайм-аутом ([thread.req.timing]).

template <class Clock, class Duration> future_status wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;

Effects: Нет, если общее состояние содержит отложенную функцию ([futures.async]), в противном случае блокируется, пока общее состояние не будет готово или пока не истечет абсолютный тайм-аут ([thread.req.timing]), указанный вabs_­time .

Returns:

  • future_­status​::​deferred если общее состояние содержит отложенную функцию.

  • future_­status​::​ready если общее состояние готово.

  • future_­status​::​timeout если функция возвращается, потому что истек абсолютный тайм-аут ([thread.req.timing]), указанный вabs_­time .

Throws: исключения, связанные с тайм-аутом ([thread.req.timing]).