Поделиться через


Класс packaged_task

Описывает асинхронный поставщик, который является оберткой вызова с сигнатурой вызова Ty(ArgTypes...). Его связанное асинхронное состояние хранит копию его вызываемого объекта, помимо возможных результатов.

Синтаксис

template <class>
class packaged_task;

Участники

Открытые конструкторы

Имя Описание
packaged_task Формирует объект packaged_task.
Деструктор packaged_task::~packaged_task Уничтожает объект packaged_task .

Открытые методы

Имя Описание
get_future Возвращает объект future, который имеет то же связанное асинхронное состояние.
make_ready_at_thread_exit Вызывает вызываемый объект, который хранится в связанном асинхронном состоянии и атомарно сохраняет возвращаемое значение.
reset; Заменяет связанное асинхронное состояние.
swap Обмен связанным асинхронным состоянием с указанным объектом.
действительный Указывает, имеет ли объект связанное асинхронное состояние.

Открытые операторы

Имя Описание
packaged_task::operator= Передает связанное асинхронное состояние из указанного объекта.
packaged_task::operator() Вызывает вызываемый объект, который хранится в связанном асинхронном состоянии, атомарно сохраняет возвращаемое значение и устанавливает состояние в значение ready.
packaged_task::operator bool Указывает, имеет ли объект связанное асинхронное состояние.

Требования

Заголовок:<будущее>

Пространство имен: std

packaged_task::get_future

Возвращает объект типа future<Ty>, который имеет то же самое связанное асинхронное состояние.

future<Ty> get_future();

Замечания

Если объект packaged_task не имеет связанного асинхронного состояния, этот метод выдает future_error с кодом ошибки no_state.

Если этот метод уже был вызван для объекта packaged_task, который имеет то же самое асинхронное состояние, этот метод выдает future_error с кодом ошибки future_already_retrieved.

packaged_task::make_ready_at_thread_exit

Вызывает вызываемый объект, который хранится в связанном асинхронном состоянии и атомарно сохраняет возвращаемое значение.

void make_ready_at_thread_exit(ArgTypes... args);

Замечания

Если объект packaged_task не имеет связанного асинхронного состояния, этот метод выдает future_error с кодом ошибки no_state.

Если этот метод или make_ready_at_thread_exit уже был вызван для объекта packaged_task, который имеет то же самое связанное асинхронное состояние, этот метод выдает future_error с кодом ошибки promise_already_satisfied.

В противном случае этот оператор вызывает INVOKE(fn, args..., Ty), где fn — вызываемый объект, который хранится в связанном асинхронном состоянии. Любое возвращаемое значение атомарно сохраняется как возвращенный результат связанного асинхронного состояния.

В отличие от packaged_task::operator(), связанное асинхронное состояние не устанавливается ready до тех пор, пока все объекты потока в вызывающем потоке были уничтожены. Как правило, потоки, которые блокируются в связанном асинхронном состоянии, не блокируются до тех пор, пока вызывающий поток не завершит работу.

packaged_task::operator=

Передает связанное асинхронное состояние из указанного объекта.

packaged_task& operator=(packaged_task&& Right);

Параметры

Right
Объект packaged_task.

Возвращаемое значение

*this

Замечания

После операции права больше не имеет связанного асинхронного состояния.

packaged_task::operator()

Вызывает вызываемый объект, который хранится в связанном асинхронном состоянии, атомарно сохраняет возвращаемое значение и устанавливает состояние в значение ready.

void operator()(ArgTypes... args);

Замечания

Если объект packaged_task не имеет связанного асинхронного состояния, этот метод выдает future_error с кодом ошибки no_state.

Если этот метод или make_ready_at_thread_exit уже был вызван для объекта packaged_task, который имеет то же самое связанное асинхронное состояние, этот метод выдает future_error с кодом ошибки promise_already_satisfied.

В противном случае этот оператор вызывает INVOKE(fn, args..., Ty), где fn — вызываемый объект, который хранится в связанном асинхронном состоянии. Любое возвращаемое значение атомарно сохраняется как возвращенный результат связанного асинхронного состояния, и состояние устанавливается в значение ready. В результате все потоки, которые заблокированы на связанном асинхронном состоянии, разблокируются.

packaged_task::operator bool

Указывает, имеет ли объект associated asynchronous state.

operator bool() const noexcept;

Возвращаемое значение

Значение true, если объект имеет связанное асинхронное состояние; в противном случае — значение false.

Конструктор packaged_task::packaged_task

Формирует объект packaged_task.

packaged_task() noexcept;
packaged_task(packaged_task&& Right) noexcept;
template <class Fn>
   explicit packaged_task(Fn&& fn);

template <class Fn, class Alloc>
   explicit packaged_task(
      allocator_arg_t, const Alloc& alloc, Fn&& fn);

Параметры

Right
Объект packaged_task.

распределить
Распределитель памяти. Дополнительные сведения см. в разделе <"Распределители>".

fn
Объект функции.

Замечания

Первый конструктор создает объект packaged_task, который не имеет связанного асинхронного состояния.

Второй конструктор создает packaged_task объект и передает связанное асинхронное состояние из Right. После операции права больше не имеет связанного асинхронного состояния.

Третий конструктор создает packaged_task объект, имеющий копию fn , хранящуюся в связанном асинхронном состоянии.

Четвертый конструктор создает packaged_task объект, имеющий копию fn , хранящуюся в связанном асинхронном состоянии, и использует alloc для выделения памяти.

Деструктор packaged_task::~packaged_task

Уничтожает объект packaged_task .

~packaged_task();

Замечания

Если связанное асинхронное состояние не готово, деструктор сохраняет исключение future_error , которое имеет код broken_promise ошибки в результате связанного асинхронного состояния, а все потоки, заблокированные на связанном асинхронном состоянии, становятся разблокированными.

packaged_task::reset

Использует новое связанное асинхронное состояние для замены существующего связанного асинхронного состояния.

void reset();

Замечания

По сути, этот метод выполняет *this = packaged_task(move(fn)), где fn является объектом функции, который хранится в связанном асинхронном состоянии для данного объекта. Таким образом, состояние объекта очищается, а get_future, оператор() и make_ready_at_thread_exit можно вызывать как будто на только что созданном объекте.

packaged_task::swap

Обмен связанным асинхронным состоянием с указанным объектом.

void swap(packaged_task& Right) noexcept;

Параметры

Right
Объект packaged_task.

packaged_task::valid

Указывает, имеет ли объект associated asynchronous state.

bool valid() const;

Возвращаемое значение

Значение true, если объект имеет связанное асинхронное состояние; в противном случае — значение false.

См. также

Справочник по файлам заголовков
<future>