0Pricing
C++ Academy · 课时

std::async 与 std::future 基础

异步运行任务,并通过 std::future 获取结果

std::async 与 std::future 基础 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

异步任务

std::async 会异步运行一个函数,并返回一个能够提供结果的 std::future。这是一种比手动管理线程更高层次的替代方案。

基本用法

传入一个可调用对象及其参数。std::async 会返回一个 std::future<Result>。

#include <future>

int compute() { return 42; }

std::future<int> f = std::async(compute);
int result = f.get();   // blocks until done

启动策略

第一个参数控制任务的运行时机:

  • std::launch::async — 立即启动新线程
  • std::launch::deferred — 在调用 get() 时同步运行
  • 默认(不指定策略)— 由实现选择
auto f = std::async(std::launch::async, compute);

std::future 方法

常见操作:

  • get() — 阻塞直到完成并返回结果(只能调用一次)
  • wait() — 阻塞,但不返回结果
  • wait_for(d) / wait_until(t) — 定时等待
  • valid() — 此异步结果对象是否已设置?

异常传播

如果异步任务抛出异常,该异常会存储在 future 中,并在调用 get() 时重新抛出。

auto f = std::async([] { throw std::runtime_error("oops"); });
try {
    f.get();
} catch (const std::exception& e) {
    std::cout << e.what();
}

返回多个值

请将结果封装在元组、结构体或容器中。

auto f = std::async([] {
    return std::make_pair(42, std::string("hello"));
});
auto [n, s] = f.get();

并行运行多个任务

启动多个异步任务,并等待它们全部完成。

auto a = std::async(work_a);
auto b = std::async(work_b);
auto c = std::async(work_c);

std::cout << a.get() + b.get() + c.get();

std::promise:手动管理异步结果

对于 consumer 需要 future,而生产者位于另一个线程中的生产者/consumer 模式,请使用 std::promise。

std::promise<int> p;
std::future<int> f = p.get_future();

std::thread t([&p] { p.set_value(42); });
std::cout << f.get();
t.join();

std::packaged_task

将可调用对象与 future 绑定。当任务在其他位置(例如线程池中)调用时,这会很有用。

shared_future

一个 std::future 只能读取一次。std::shared_future 允许多个读取者读取结果,适合广播结果。

析构函数行为

使用默认策略通过 std::async 返回的 future 的析构函数,可能会阻塞直到任务完成。对于长时间运行的任务,请注意这一点。

超越 std::async

对于生产级异步编程,可以考虑 Boost.Asio、Folly 或 C++20/23 的执行器和协程。std::async 是一个起点。

快速检查

对 std::future 调用 .get() 会做什么?

回顾

std::async 会异步运行函数;返回的 std::future 提供结果并传播异常。请使用启动策略控制执行方式。对于复杂模式,请使用 std::promise 和 std::packaged_task。

常见问题解答

「std::async 与 std::future 基础」课时是免费的吗?

是的 — 「std::async 与 std::future 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「std::async 与 std::future 基础」这节课中我会学到什么?

异步运行任务,并通过 std::future 获取结果 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「std::async 与 std::future 基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. std::thread:加入与分离
  2. std::mutex、lock_guard 与 unique_lock
  3. 条件变量与工作线程模式
  4. std::async 与 std::future 基础
← 返回 C++ Academy