Шаблон класса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 note Note: future_error future_errc::no_state — end 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;
shared_future(const shared_future& rhs) noexcept;
Effects: Создаетshared_future объект, который ссылается на то же общее состояние, что иrhs (если есть).
shared_future(future<R>&& rhs) noexcept;
shared_future(shared_future&& rhs) noexcept;
Effects: Move создаетshared_future объект, который ссылается на общее состояние, на которое первоначально ссылалсяrhs (если таковой имеется).
~shared_future();
shared_future& operator=(shared_future&& rhs) noexcept;
Effects:
Освобождает любое разделяемое состояние ([futures.state]);
переместить Назначает содержимоеrhs в*this.
shared_future& operator=(const shared_future& rhs) noexcept;
Effects:
Освобождает любое разделяемое состояние ([futures.state]);
присваивает содержимоеrhs в*this. [ Note: В результате *this относится к тому же общему состоянию, что иrhs (если есть). ] — end note
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() ничего не возвращает.
bool valid() const noexcept;
void wait() const;
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]).