33 Thread support library [thread]

33.6 Futures [futures]

33.6.8 Class template shared_­future [futures.shared_future]

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

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

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

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

    // retrieving the value
    see below get() const;

    // 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;
  };
}

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

shared_future() noexcept;

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

Postconditions:valid() == false.

shared_future(const shared_future& rhs) noexcept;

Effects: Создаетshared_­future объект, который ссылается на то же общее состояние, что иrhs (если есть).

Postconditions:valid() возвращает то же значение, что иrhs.valid().

shared_future(future<R>&& rhs) noexcept; shared_future(shared_future&& rhs) noexcept;

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

Postconditions:

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

  • rhs.valid() == false.

~shared_future();

Effects:

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

Effects:

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

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

Postconditions:

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

  • rhs.valid() == false.

shared_future& operator=(const shared_future& rhs) noexcept;

Effects:

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

  • присваивает содержимоеrhs в*this. [ Note: В результате *this относится к тому же общему состоянию, что иrhs (если есть). ] end note

Postconditions:valid() == rhs.valid().

const R& shared_future::get() const; R& shared_future<R&>::get() const; void shared_future<void>::get() const;

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

[ Note: Доступ к объекту значения, хранящемуся в общем состоянии, несинхронизирован, поэтому программисты должны применять только те операции, надR которыми не возникает гонка данных ([intro.multithread]). ]end note

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

Returns:

  • shared_­future​::​get() возвращает константную ссылку на значение, хранящееся в общем состоянии объекта. [ Note: Доступ по этой ссылке после уничтожения общего состояния приводит к неопределенному поведению; этого можно избежать, если не хранить ссылку в любом хранилище с большим сроком жизни, чем уshared_­future объекта, который вернул ссылку. ]end note

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

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

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

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]).