← 模式

异步执行任务

12345678910111213141516171819#include <future> int func() { int some_value = 0; // 执行工作... return some_value; } int main() { std::future<int> result_future = std::async(func); // 做些其他事... int result = result_future.get(); }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

高阶的任务异步执行。

描述

std::async 提供了一种高阶的方式来完成任务的异步执行,它抽象了 std::threadstd::promise

第 14 行,我们调用 std::async,将 func 作为要异步执行的函数传递给它。func 的参数可以作为额外的参数传递给 std::async。返回值是一个 std::future<int>,代表一个将在未来某个时刻从任务返回的 int 值。

默认情况下,std::async 会自行决定是并发执行任务,还是等到我们请求结果时才执行任务。如果我们想明确指定其中一种行为,可以在第一个参数位置使用一个标志。要请求并发执行(如果可能),我们使用 std::launch::async。要请求仅在需要结果时才执行任务,我们使用 std::launch::deferred

第 18 行,我们使用 std::futureget 成员函数来获取异步任务的结果。这个调用会阻塞直到结果可用。

注意:我们必须捕获 std::async 返回的 future 对象,这一点非常重要。如果我们不这样做,那么调用将始终是阻塞的。

贡献者

  • Joseph Mansfield
  • Mark A. Gibbs

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享