std::async和std::future用于异步任务执行与结果获取,通过launch策略控制执行方式,future.get()阻塞获取结果并传播异常,支持限时等待与异常安全处理,简化并发编程。

在C++11中引入的 std::async 和 std::future 提供了一种简洁、安全的方式来执行异步任务并获取其结果。它们是标准库中支持并发编程的重要工具,适用于需要后台计算并等待结果的场景。
std::async:启动异步任务
std::async 是一个函数模板,用于启动一个异步任务(即在单独的线程或延迟执行中运行一个可调用对象),它返回一个 std::future 对象,用来获取该任务的返回值。
基本语法:
std::future result = std::async(launch_policy, function, args...);
launch_policy:指定任务的启动策略,可选值有: std::launch::async:强制在新线程中异步执行。 std::launch::deferred:延迟执行,直到调用 future 的 get 或 wait 时才在当前线程执行。 默认值为两者均可(std::launch::async | std::launch::deferred),由系统决定。 function:要异步执行的函数、lambda 表达式或仿函数。 args…:传递给函数的参数。
示例:
立即学习“C++免费学习笔记(深入)”;
#include #include #include int slow_calculation() { std::this_thread::sleep_for(std::chrono::seconds(2)); return 42;}int main() { auto future_result = std::async(std::launch::async, slow_calculation); std::cout << "正在执行其他操作...n"; int value = future_result.get(); // 阻塞直到结果就绪 std::cout << "结果: " << value << "n"; return 0;}
std::future:获取异步结果
std::future 是一个模板类,表示一个可能尚未完成的异步操作的结果。通过调用其成员函数 get() 可以获取结果,此调用会阻塞,直到结果可用。
常用方法:
.get():获取结果,只能调用一次,之后 future 变为无效状态。 .wait():等待任务完成,不获取结果。 .valid():检查 future 是否关联了有效的共享状态。 .wait_for(timeout) / .wait_until(time_point):限时等待,可用于避免无限阻塞。
示例:限时等待结果
auto future = std::async(slow_calculation);if (future.wait_for(std::chrono::milliseconds(100)) == std::future_status::ready) { std::cout << "结果: " << future.get() << "n";} else { std::cout << "任务未完成n";}
共享状态与异常处理
std::future 所持有的“共享状态”是由 async 创建的任务和 future 共同访问的数据结构。当任务抛出异常时,该异常会被封装并在线程调用 get() 时重新抛出。
示例:捕获异步任务中的异常
auto faulty_task = std::async([](){ throw std::runtime_error("出错了!");});try { faulty_task.get();} catch (const std::exception& e) { std::cout << "捕获异常: " << e.what() << "n";}
这种机制保证了异常不会丢失,便于统一错误处理。
实际使用建议与注意事项
避免多个线程同时调用同一个 future 的 get(),因为只能成功调用一次。 如果不关心返回值,可以使用 std::async 启动任务后立即 wait() 等待完成。 注意资源消耗:std::launch::async 可能创建新线程,频繁使用可能导致线程过多。 如果希望延迟执行,使用 std::launch::deferred,适合轻量或可能不需要执行的任务。 future 析构时若仍有关联的异步任务且为 deferred 模式,行为正常;但 async 模式下会阻塞等待完成(C++14 起)。
基本上就这些。std::async 和 std::future 让异步编程变得直观且类型安全,适合大多数需要“发任务、等结果”的场景,无需手动管理线程生命周期。
以上就是c++++中std::async和std::future的用法_c++异步任务与结果获取机制讲解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486008.html
微信扫一扫
支付宝扫一扫