std::async和std::future用于C++11异步编程,通过launch策略启动任务并返回future对象,调用get获取结果,wait_for可实现超时等待。

在C++11中,std::async 和 std::future 提供了一种简洁的异步编程方式,用于启动异步任务并获取其结果。它们是标准库中支持并发的重要工具,适合处理需要后台执行并返回结果的场景。
std::async 基本用法
std::async 是一个函数模板,用于启动一个异步任务。它会返回一个 std::future 对象,通过这个对象可以获取任务的返回值。
基本语法:
std::future fut = std::async(launch_policy, function, args…);
其中:
立即学习“C++免费学习笔记(深入)”;
launch_policy:启动策略,可选 std::launch::async(强制异步执行)或 std::launch::deferred(延迟执行,调用 get 时才执行) function:要执行的函数(普通函数、lambda、成员函数等) args…:传递给函数的参数
示例:
auto future = std::async(std::launch::async, []() {
return 42;
});
int result = future.get(); // 阻塞等待结果,result == 42
std::future 获取异步结果
std::future 是一个模板类,表示一个将来会得到的值。常用方法包括:
.get():获取结果,只能调用一次,调用后 future 变为无效状态 .wait():等待任务完成,不获取结果 .wait_for(timeout) 或 .wait_until(time):限时等待
注意:一旦调用了 get(),就不能再次调用,否则会抛出异常。
示例:带超时等待
auto future = std::async([]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return “done”;
});
auto status = future.wait_for(std::chrono::seconds(1));
if (status == std::future_status::ready) {
std::cout } else {
std::cout }
共享 future:std::shared_future
如果需要多次获取结果,或者多个线程同时访问同一个 future 的结果,应使用 std::shared_future。
可以通过 std::future 调用 .share() 得到 shared_future:
auto future = std::async([](){ return 100; });
std::shared_future sf = future.share();
// 多次获取结果
int a = sf.get();
int b = sf.get(); // 合法
实际应用场景
常见用途包括:
并行计算:比如同时计算两个大数的平方根 IO预加载:提前读取文件或网络数据 UI响应优化:避免主线程阻塞
示例:并行执行两个函数
auto f1 = std::async(std::launch::async, []{
return expensive_calculation_a();
});
auto f2 = std::async(std::launch::async, []{
return expensive_calculation_b();
});
int res1 = f1.get();
int res2 = f2.get();
int total = res1 + res2;
基本上就这些。std::async 和 std::future 让异步编程变得直观,但要注意资源管理和异常安全——如果 future 析构前未调用 get 或 wait,可能会阻塞析构。
以上就是c++++ std::async和std::future怎么用_c++异步编程future用法详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485855.html
微信扫一扫
支付宝扫一扫