c++怎么使用std::async和std::future进行异步编程_c++异步任务与future用法详解

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

c++怎么使用std::async和std::future进行异步编程_c++异步任务与future用法详解

在C++11中引入的 std::asyncstd::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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 04:59:42
下一篇 2025年12月19日 05:00:00

相关推荐

发表回复

登录后才能评论
关注微信