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 | 将关联异步状态与指定对象交换。 |
valid | 指定对象是否具有关联异步状态。 |
公共运算符
“属性” | 描述 |
---|---|
packaged_task::operator= | 从指定对象传输关联异步状态。 |
packaged_task::operator() | 调用存储在关联异步状态中的可调用的对象,以原子方式存储返回值,并将其状态设置为就绪。 |
packaged_task::operator bool | 指定对象是否具有关联异步状态。 |
要求
标头:<future>
命名空间: std
packaged_task::get_future
返回具有相同关联异步状态的 future<Ty>
类型的对象。
future<Ty> get_future();
备注
如果 packaged_task
对象没有关联的异步状态,则此方法将引发具有错误代码 no_state
的 future_error。
如果已为具有相同关联异步状态的 packaged_task
对象调用此方法,则此方法将引发具有错误代码 future_already_retrieved
的 future_error
。
packaged_task::make_ready_at_thread_exit
调用存储在关联异步状态中的可调用的对象,并以原子方式存储返回值。
void make_ready_at_thread_exit(ArgTypes... args);
注解
如果 packaged_task
对象没有关联的异步状态,则此方法将引发具有错误代码 no_state
的 future_error。
如果已为具有相同的关联异步状态的 packaged_task
对象调用此方法或 make_ready_at_thread_exit,则此方法将引发具有错误代码 promise_already_satisfied
的 future_error
。
否则,此运算符会调用 INVOKE(fn, args..., Ty)
,其中 fn 是存储在关联异步状态中的可调用的对象。 将任何返回值作为关联异步状态的返回结果以原子方式存储。
与 packaged_task::operator() 相反,在正在调用的线程中的所有线程本地对象被销毁前不会将关联的异步状态设置为 ready
。 通常,在关联的异步状态上受阻的线程会受到阻止,直到正在调用的线程退出。
packaged_task::operator=
从指定的对象传输关联异步状态。
packaged_task& operator=(packaged_task&& Right);
参数
Right
packaged_task
对象。
返回值
*this
注解
操作后,Right 不再具有关联异步状态。
packaged_task::operator()
调用存储在关联异步状态中的可调用的对象,以原子方式存储返回值,并将其状态设置为就绪。
void operator()(ArgTypes... args);
备注
如果 packaged_task
对象没有关联的异步状态,则此方法将引发具有错误代码 no_state
的 future_error。
如果已为具有相同的关联异步状态的 packaged_task
对象调用此方法或 make_ready_at_thread_exit,则此方法将引发具有错误代码 promise_already_satisfied
的 future_error
。
否则,此运算符会调用 INVOKE(fn, args..., Ty)
,其中 fn 是存储在关联异步状态中的可调用的对象。 将任何返回值作为关联异步状态的返回结果以原子方式存储,且状态设置为就绪。 结果,不再阻止在关联的异步状态上受阻的任何线程。
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
对象。
alloc
内存分配器。 有关详细信息,请参阅 <allocators>。
fn
一个函数对象。
备注
第一个构造函数构造没有关联异步状态的 packaged_task
对象。
第二个构造函数构造 packaged_task
对象并从 Right 传输关联异步状态。 操作后,Right 不再具有关联异步状态。
第三个构造函数构造 packaged_task
对象,该对象具有存储在其关联异步状态中的 fn 的副本。
第四个构造函数构造 packaged_task
对象(该对象具有存储在其关联异步状态中的 fn 的副本)并使用 alloc
分配内存。
packaged_task::~packaged_task 析构函数
销毁 packaged_task
对象。
~packaged_task();
备注
如果关联异步状态未就绪,则析构函数将存储具有错误代码 broken_promise
的 future_error 异常作为关联异步状态中的结果,并且不再阻止在关联异步状态上受阻的任何线程。
packaged_task::reset
使用新的关联异步状态替换现有的关联异步状态。
void reset();
备注
实际上,此方法将执行 *this = packaged_task(move(fn))
,其中 fn 是存储在此对象的关联异步状态中的函数对象。 因此,将清除该对象的状态,且可像在新构造的对象上一样调用 get_future、operator() 和 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
。