std::async是C++11引入的轻量级异步机制,返回future用于取结果或等待;支持async(新线程立即执行)和deferred(调用get/wait时同步执行)策略,默认由实现决定,建议显式指定。

std::async 是 C++11 引入的轻量级异步启动机制,用来“扔一个任务去后台跑”,并立即返回一个 std::future 对象,用于后续取结果或等待完成。它不直接管理线程,而是由运行时决定是新开线程执行,还是延迟到 future.wait()/get() 时才同步执行(取决于 launch 策略)。
最常用形式是传入可调用对象(函数、lambda、bind 等)和参数,返回 future:
#include <future>
#include <iostream>
<p>int compute(int x) { return x <em> x + 2 </em> x + 1; }</p><p>int main() {
// 启动异步计算,auto 推导为 std::future<int>
auto fut = std::async(std::launch::async, compute, 5);</p><pre class="brush:php;toolbar:false;">// 做其他事……
std::cout << "busy work...\n";
// 阻塞等待结果(若未完成),然后取值
int result = fut.get(); // 输出 36(5² + 2×5 + 1)
std::cout << "result = " << result << "\n";}
立即学习“C++免费学习笔记(深入)”;
注意:fut.get() 只能调用一次;调用后 future 失效;若任务抛异常,get() 会重新抛出。
std::launch 是枚举类型,控制任务何时/如何执行:
wait() 或 get() 时,以同步方式在当前线程执行(无并发,但避免过早计算)std::launch::async | std::launch::deferred,由实现决定选哪个(常见实现优先 async,除非资源紧张)建议显式指定策略,避免行为不确定。例如想确保并发,就写 std::async(std::launch::async, ...)。
除了 get()(取值+阻塞+释放 future),还可:
std::future_status(ready / timeout / deferred)示例:
auto fut = std::async(std::launch::async, []{
std::this_thread::sleep_for(2s);
return 42;
});
<p>if (fut.wait_for(1s) == std::future_status::timeout) {
std::cout << "still running...\n";
}
// 再等一次,或直接 get()
std::cout << fut.get() << "\n"; // 输出 42std::async 简单易用,但有隐含成本和限制:
get() 或 wait(),且任务是 async 模式,析构会**阻塞等待完成**(易引发意外卡顿!)std::promise + std::future 组合,或使用线程池、第三方库(如 folly、boost.asio)简单任务用 async 足够;复杂并发逻辑,别硬套 async,该上 promise 就上。
基本上就这些。std::async 是入门并发的好跳板,理解它怎么和 future 协作,就踩稳了 C++ 异步的第一步。
以上就是C++中的std::async怎么用?C++异步编程与future/promise入门【并发编程】的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号