33 Thread support library [thread]

33.6 Futures [futures]

33.6.10 Class template packaged_­task [futures.task]

33.6.10.1 packaged_­task member functions [futures.task.members]

packaged_task() noexcept;

Effects: Создает packaged_­task объект без общего состояния и без сохраненной задачи.

template <class F> packaged_task(F&& f);

Requires: INVOKE<R>(f, t1, t2, ..., tN), где t1, t2, ..., tN - значения соответствующих типов в ArgTypes..., должно быть допустимым выражением. Вызов копии f должен вести себя так же, как и вызов f.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если decay_­t<F> он того же типа, что и packaged_­task<R(ArgTypes...)>.

Effects: Создает новый packaged_­task объект с общим состоянием и инициализирует сохраненную задачу объекта с помощью std​::​forward<F>(f).

Throws:

  • Любые исключения, создаваемые конструктором копирования или перемещения f.

  • Для первой версии, bad_­alloc если не удалось выделить память для внутренних структур данных.

  • Для второй версии любые исключения, созданные allocator_­traits<Allocator>​::​template rebind_­traits<unspecified>​::​allocate.

packaged_task(packaged_task&& rhs) noexcept;

Effects: Создает новый packaged_­task объект и передает владение rhsобщим состоянием *this, оставив его rhs без общего состояния. Перемещает сохраненную задачу из rhs в *this.

Postconditions: rhs не имеет общего состояния.

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

Effects:

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

  • звонки packaged_­task(std​::​move(rhs)).swap(*this).

~packaged_task();

Effects: Отменяет любое общее состояние ([futures.state]).

void swap(packaged_task& other) noexcept;

Effects: Меняет общие состояния и сохраненные задачи *this и other.

Postconditions: *this имеет такое же общее состояние и сохраненную задачу (если есть), что и other до вызова swap. other имеет такое же общее состояние и сохраненную задачу (если есть), что и *this до вызова swap.

bool valid() const noexcept;

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

future<R> get_future();

Returns: future Объект , который разделяет то же общегосударственный как *this.

Throws: future_­error объекта в случае возникновения ошибки.

Error conditions:

  • future_­already_­retrieved if get_­future уже был вызван для packaged_­task объекта с тем же общим состоянием, что и *this.

  • no_­state если *this не имеет общего состояния.

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

Effects: Как будто по INVOKE<R>(f, t1, t2, ..., tN), где f хранится задача *this и t1, t2, ..., tN значения в args.... Если задача возвращается нормально, возвращаемое значение сохраняется как асинхронный результат в общем состоянии *this, в противном случае сохраняется исключение, созданное задачей. Общее состояние *this готово, и все потоки, заблокированные в функции, ожидающие *this готовности общего состояния , разблокируются.

Throws: future_­error объект исключения , если нет общегосударственных или сохраненное задание уже вызван.

Error conditions:

  • promise_­already_­satisfied если сохраненная задача уже была вызвана.

  • no_­state если *this не имеет общего состояния.

void make_ready_at_thread_exit(ArgTypes... args);

Effects: Как будто по INVOKE<R>(f, t1, t2, ..., tN), где f хранится задача, а t1, t2, ..., tN какие - значения в args.... Если задача возвращается нормально, возвращаемое значение сохраняется как асинхронный результат в общем состоянии *this, в противном случае сохраняется исключение, созданное задачей. В любом случае это должно быть сделано без[futures.state]немедленного преобразования этого состояния в состояние ready ( ). Планирует подготовить общее состояние к моменту выхода из текущего потока после того, как все объекты продолжительности хранения потока, связанные с текущим потоком, будут уничтожены.

Throws: future_­error если возникает состояние ошибки.

Error conditions:

  • promise_­already_­satisfied если сохраненная задача уже была вызвана.

  • no_­state если *this не имеет общего состояния.

void reset();

Effects: Как будто *this = packaged_­task(std​::​move(f)), где f хранится задача *this. [ Note: Это создает новое общее состояние для *this. Старое состояние заброшено ([futures.state]). ] end note

Throws:

  • bad_­alloc если не удалось выделить память для нового общего состояния.

  • любое исключение, созданное конструктором перемещения задачи, хранящейся в общем состоянии.

  • future_­error с ошибкой no_­state if *this не имеет общего состояния.