<future>
函数
async
future_category
make_error_code
make_error_condition
swap
|
async
表示一个异步提供程序。
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(Fn&& fn, ArgTypes&&... args);
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(launch policy, Fn&& fn, ArgTypes&&... args);
参数
策略
一个 launch
值。
备注
缩写的定义:
缩写 | 说明 |
---|---|
dfn |
调用 decay_copy(forward<Fn>(fn)) 的结果。 |
dargs |
调用 decay_copy(forward<ArgsTypes>(args...)) 的结果。 |
Ty |
result_of<Fn(ArgTypes...)>::type 类型。 |
第一个模板函数返回 async(launch::any, fn, args...)
。
第二个函数返回一个 future<Ty>
对象,其“关联的异步状态”包含一个结果以及 dfn
和 dargs
的值和一个用于管理单独的执行线程的线程对象。
除非 decay<Fn>::type
是一种不同于 launch 的类型,否则第二个函数将不参与重载解析。
C++ 标准指出,如果策略为 launch::async,则函数将创建新的线程。 但是,Microsoft 实现当前并不符合。 它从 Windows ThreadPool 获取其线程,它在某些情况下可能会提供回收的线程而不是新的线程。 这意味着将 launch::async
策略实现为 launch::async|launch::deferred
。 基于 ThreadPool 的实现的另一个含义是,无法保证线程局部变量在线程完成时会被销毁。 如果将线程回收并提供给对 async
的新调用,则旧变量仍将存在。 建议不将线程局部变量与 async
一起使用。
如果“策略”为 launch::deferred
,则函数会将其关联异步状态标记为包含一个“延迟函数”并返回。 对任何等待关联异步状态生效的非计时函数的第一次调用都将通过计算 INVOKE(dfn, dargs..., Ty)
来调用延迟函数。
任何情况下,在通过引发异常或正常返回完成 INVOKE(dfn, dargs..., Ty)
的计算之前,future
对象的关联异步状态不会设置为就绪。 如果引发了异常,则关联异步状态的结果为异常,否则为计算返回的任何值。
注意
对于一个附加到以 std::async
开头的任务的 future
(或最后一个 shared_future
),如果任务尚未完成,则析构函数将阻塞;即,如果此线程尚未调用 .get()
或 .wait()
且任务仍在进行,则析构函数将阻塞。 如果从 future
中获得的 std::async
移出局部范围,则使用它的其他代码必须知道其析构函数可能在共享状态变成已就绪时阻塞。
伪函数 INVOKE
是在 <functional>
中定义的。
Microsoft 专用
异步执行传递的函数时,将在 Windows 线程池上执行;请参阅线程池。 并发线程数限制为线程池默认值(当前为 500)。 在硬件上并发执行的线程数当前受进程处理器组中逻辑处理器数的限制,因此实际上限制为 64;请参阅处理器组。
future_category
返回一个描述与 future
对象相关联错误特征的 error_category 对象的引用。
const error_category& future_category() noexcept;
make_error_code
创建一个 error_code 以及一个描述 future 错误特征的 error_category 对象。
inline error_code make_error_code(future_errc Errno) noexcept;
参数
Errno
一个标识已报告错误的 future_errc 值。
返回值
error_code(static_cast<int>(Errno), future_category());
make_error_condition
创建一个 error_condition 以及一个描述 future 错误特征的 error_category 对象。
inline error_condition make_error_condition(future_errc Errno) noexcept;
参数
Errno
一个标识已报告错误的 future_errc 值。
返回值
error_condition(static_cast<int>(Errno), future_category());
swap
将一个 promise
对象的关联异步状态与另一对象的关联异步状态交换。
template <class Ty>
void swap(promise<Ty>& Left, promise<Ty>& Right) noexcept;
template <class Ty, class... ArgTypes>
void swap(packaged_task<Ty(ArgTypes...)>& Left, packaged_task<Ty(ArgTypes...)>& Right) noexcept;
参数
Left
左 promise
对象。
Right
正确的 promise
对象。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈