std::async与std::future用于异步任务执行和结果获取,支持async、deferred启动策略,通过get()获取结果或异常,shared_future允许多次读取,适用于轻量级并发场景。

在C++11中引入的 std::async 和 std::future 提供了一种简洁的方式来执行异步任务并获取其结果。它们属于标准库中的并发支持工具,让开发者无需直接操作线程就能实现非阻塞计算。
std::async 是一个函数模板,用于启动一个异步任务,返回一个 std::future 对象,用来获取任务的返回值。它有两种启动策略:
默认情况下,系统可自由选择策略(使用 std::launch::async | std::launch::deferred)。
示例代码:
#include <future>
#include <iostream>
#include <thread>
int heavy_computation() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
int main() {
// 启动异步任务
std::future<int> fut = std::async(std::launch::async, heavy_computation);
std::cout << "正在执行其他操作...\n";
// 获取结果(会阻塞直到完成)
int result = fut.get();
std::cout << "结果: " << result << "\n";
return 0;
}
std::future 是一个模板类,代表某个异步操作的“未来”结果。常用方法包括:
立即学习“C++免费学习笔记(深入)”;
如果任务抛出异常,调用 get() 会重新抛出该异常。
带超时等待的示例:
std::future<double> fut = std::async([]() {
std::this_thread::sleep_for(std::chrono::seconds(3));
return 3.14;
});
// 等待最多2秒
auto status = fut.wait_for(std::chrono::seconds(2));
if (status == std::future_status::ready) {
std::cout << "结果: " << fut.get() << "\n";
} else {
std::cout << "任务未完成\n";
}
一个 std::future 只能调用一次 get()。如果需要多次读取结果或在多个地方访问,可以使用 std::shared_future。
通过将 std::future 转移给 std::shared_future,可以实现多消费者模式。
示例:使用 shared_future 多次获取结果
std::future<std::string> fut = std::async([]{
return "Hello from async!";
});
std::shared_future<std::string> sf = fut.share();
// 多次调用 get()
std::cout << sf.get() << "\n";
std::cout << sf.get() << "\n"; // 可重复调用
异步任务中抛出的异常会被捕获并存储,当调用 future 的 get() 方法时重新抛出。
建议使用 try-catch 包裹 get() 调用。
异常处理示例:
std::future<void> f = std::async([] {
throw std::runtime_error("出错了!");
});
try {
f.get(); // 这里会抛出异常
} catch (const std::exception& e) {
std::cout << "捕获异常: " << e.what() << "\n";
}
基本上就这些。std::async 和 std::future 组合适合轻量级异步计算场景,如后台数据加载、预计算等。注意不要滥用,因为每个 async 可能创建新线程,系统资源有限。对于复杂任务调度,建议结合线程池或更高级的并发模型。
以上就是c++++怎么使用std::async和std::future进行异步编程_c++异步任务与future用法详解的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号