C++中async与future用于异步任务执行和结果获取,std::async启动任务并返回std::future对象,通过get()阻塞获取结果,支持超时检测与异常传递,提升并发编程效率。

C++中的async与future是处理异步任务和获取返回值的核心工具,适用于需要并发执行且获取结果的场景。它们定义在头文件中,配合使用可以轻松实现多线程任务的非阻塞调用和结果获取。
async与future基本概念
std::async用于启动一个异步任务,返回一个std::future对象,该对象可用来获取任务的返回值或异常。任务可以在新线程中执行,也可以延迟执行,取决于启动策略。
常用启动策略:
std::launch::async:强制在新线程中执行任务 std::launch::deferred:延迟执行,直到调用get()时才在当前线程执行
默认策略是两者均可,由系统决定。
立即学习“C++免费学习笔记(深入)”;
获取异步函数的返回值
通过future.get()获取异步任务的返回值,该调用会阻塞,直到结果就绪。
示例代码:
#include #include #include int compute_sum(int a, int b) { std::this_thread::sleep_for(std::chrono::seconds(2)); return a + b;}int main() { // 启动异步任务 std::future result = std::async(std::launch::async, compute_sum, 10, 20); std::cout << "正在执行计算...n"; // 获取结果(阻塞等待) int sum = result.get(); std::cout << "结果: " << sum << "n"; return 0;}
输出:
正在执行计算...结果: 30
注意:get()只能调用一次,之后future变为无效状态。
检查任务状态与非阻塞获取
使用future.wait_for()或future.wait_until()可实现超时检查,避免长时间阻塞。
示例:带超时的结果获取
std::future fut = std::async(compute_sum, 5, 15);auto status = fut.wait_for(std::chrono::milliseconds(100));if (status == std::future_status::ready) { std::cout << "结果: " << fut.get() << "n";} else { std::cout << "任务未完成n";}
这适合对响应时间敏感的应用,比如用户界面或实时系统。
异常传递与错误处理
异步任务中抛出的异常会被捕获并存储,调用get()时重新抛出。
std::future f = std::async([]{ throw std::runtime_error("任务失败");});try { f.get();} catch (const std::exception& e) { std::cout << "捕获异常: " << e.what() << "n";}
这种机制让主线程能统一处理异步任务的异常,提升程序健壮性。
基本上就这些。掌握async与future的组合使用,能有效简化C++异步编程中的结果获取流程,避免手动管理线程和共享数据的复杂性。
以上就是C++ async与future用法教程_C++异步任务返回值获取方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487360.html
微信扫一扫
支付宝扫一扫