<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);

参数

policy
一个 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> 对象,其“关联的异步状态”包含一个结果以及 dfndargs 的值和一个用于管理单独的执行线程的线程对象。

除非 decay<Fn>::type 是一种不同于 launch 的类型,否则第二个函数将不参与重载解析。

C++标准指出,如果策略为 launch::async,该函数的行为就像它在新线程中调用可调用的对象一样。 这意味着,虽然它通常会导致创建新线程,但实现可能会使用其他机制来实现等效的行为。 但是,Microsoft实现当前不符合此行为。 它从 Windows ThreadPool 获取线程,该线程可以提供回收线程而不是新的线程。 这意味着,该 launch::async 策略实际上作为实现方式 launch::async|launch::deferred。 基于 ThreadPool 的实现的另一个含义是,不能保证线程完成时会销毁线程本地变量。 如果线程被回收并提供给新调用 async,则旧变量仍然存在。 建议避免将线程局部变量与 async..

如果 policylaunch::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 个线程。

在 Windows 11 和 Windows Server 2022 之前,应用程序默认限制为最多具有 64 个逻辑处理器的单个处理器组。 这会将并发执行的线程数限制为 64。 有关详细信息,请参阅 处理器组

从 Windows 11 和 Windows Server 2022 开始,进程及其线程具有处理器相关性,默认情况下跨系统中的所有处理器以及具有 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 具有 error_category 错误特征 future 的对象。

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 对象。

另请参阅

<future>