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

在C++11中引入的 std::async 和 std::future 提供了一种简洁的方式来执行异步任务并获取其结果。它们属于标准库中的并发支持工具,让开发者无需直接操作线程就能实现非阻塞计算。
std::async 的基本用法
std::async 是一个函数模板,用于启动一个异步任务,返回一个 std::future 对象,用来获取任务的返回值。它有两种启动策略:
std::launch::async:强制在新线程中运行任务 std::launch::deferred:延迟执行,直到调用 get() 或 wait() 时才在当前线程运行
默认情况下,系统可自由选择策略(使用 std::launch::async | std::launch::deferred)。
示例代码:
#include #include #include int heavy_computation() { std::this_thread::sleep_for(std::chrono::seconds(2)); return 42;}int main() { // 启动异步任务 std::future fut = std::async(std::launch::async, heavy_computation); std::cout << "正在执行其他操作...n"; // 获取结果(会阻塞直到完成) int result = fut.get(); std::cout << "结果: " << result << "n"; return 0;}
std::future 获取异步结果
std::future 是一个模板类,代表某个异步操作的“未来”结果。常用方法包括:
立即学习“C++免费学习笔记(深入)”;
.get():获取结果,只能调用一次,调用后 future 变为无效状态 .wait():等待任务完成,不获取结果 .wait_for(timeout) 或 .wait_until(time):限时等待
如果任务抛出异常,调用 get() 会重新抛出该异常。
带超时等待的示例:
std::future 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::shared_future
一个 std::future 只能调用一次 get()。如果需要多次读取结果或在多个地方访问,可以使用 std::shared_future。
通过将 std::future 转移给 std::shared_future,可以实现多消费者模式。
示例:使用 shared_future 多次获取结果
std::future fut = std::async([]{ return "Hello from async!";});std::shared_future sf = fut.share();// 多次调用 get()std::cout << sf.get() << "n";std::cout << sf.get() << "n"; // 可重复调用
异步任务的异常处理
异步任务中抛出的异常会被捕获并存储,当调用 future 的 get() 方法时重新抛出。
建议使用 try-catch 包裹 get() 调用。
异常处理示例:
std::future 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用法详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1480860.html
微信扫一扫
支付宝扫一扫