Класс 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
.