前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >std::future类

std::future类

作者头像
用户11396661
发布于 2025-03-15 12:18:05
发布于 2025-03-15 12:18:05
8300
代码可运行
举报
文章被收录于专栏:C++开发C++开发
运行总次数:0
代码可运行
1. 引入头文件

使用std::future需要包含<future>头文件:

#include <future>

2. 创建std::future对象

通常通过std::async函数来创建一个std::future对象,std::async用于启动一个异步任务。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

#include <future>

// 一个简单的函数,用于异步执行

int factorial(int n) {

int result = 1;

for (int i = 2; i <= n; ++i) {

result *= i;

}

return result;

}

int main() {

// 启动一个异步任务,计算5的阶乘

std::future<int> result = std::async(factorial, 5);

// 这里可以做其他的工作,而不必等待异步任务完成

std::cout << "继续执行其他任务..." << std::endl;

// 获取异步任务的结果,这会阻塞当前线程,直到任务完成

int factorial_result = result.get();

std::cout << "5的阶乘是: " << factorial_result << std::endl;

return 0;

}

在上述代码中,std::async(factorial, 5)启动了一个异步任务来计算 5 的阶乘,并返回一个std::future<int>对象,通过调用result.get()可以获取异步任务的计算结果。

3. std::future的状态

std::future有三种状态:

  • 未就绪(not_ready):异步任务尚未完成。
  • 就绪(ready):异步任务已经完成。
  • 异常(exception):异步任务在执行过程中抛出了异常。

可以通过std::future_status枚举来检查std::future的状态,使用wait_for函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

#include <future>

#include <chrono>

int main() {

std::future<int> result = std::async([]() {

std::this_thread::sleep_for(std::chrono::seconds(2));

return 42;

});

// 等待任务完成,最多等待1秒

auto status = result.wait_for(std::chrono::seconds(1));

if (status == std::future_status::ready) {

std::cout << "任务已完成,结果是: " << result.get() << std::endl;

} else if (status == std::future_status::timeout) {

std::cout << "等待超时,任务尚未完成" << std::endl;

} else if (status == std::future_status::deferred) {

std::cout << "任务被延迟执行" << std::endl;

}

return 0;

}
4. 获取异常

如果异步任务抛出异常,result.get()会重新抛出该异常,我们可以通过try-catch块来捕获异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

#include <future>

int throw_exception() {

throw std::runtime_error("发生了一个运行时错误");

return 42;

}

int main() {

std::future<int> result = std::async(throw_exception);

try {

int value = result.get();

} catch (const std::exception& e) {

std::cout << "捕获到异常: " << e.what() << std::endl;

}

return 0;

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
std future get_waitkey(0)
1.1 关于std::future_status: std::future_status是一个枚举类型,其值有三:
全栈程序员站长
2022/10/04
4240
UNIX(多线程):19---Future 类型详解
本文主要介绍 std::future,std::shared_future 以及 std::future_error,另外还会介绍 <future> 头文件中的 std::async,std::future_category 函数以及相关枚举类型。
用户3479834
2021/02/03
6251
c++11 多线程入门教程(一)
原文链接:https://www.cnblogs.com/DOMLX/p/10945309.html
徐飞机
2019/06/03
9990
C++一分钟之-未来与承诺:std::future与std::promise
在现代C++编程中,std::future和std::promise是异步编程模型中的两个重要组件,它们构成了C++标准库中处理异步计算结果的基础。本文将深入浅出地介绍这两个概念,探讨它们的应用场景、常见问题、易错点及如何避免,同时辅以代码示例,帮助读者更好地理解和运用这些机制。
Jimaks
2024/06/27
1.4K0
C++11异步编程(std::async, std::future, std::packaged_task, std::promise)
       std::async是一个函数模板,会启动一个异步任务,最终返回一个std::future对象。在之前我们都是通过thread去创建一个子线程,但是如果我们要得到这个子线程所返回的结果,那么可能就需要用全局变量或者引用的方法来得到结果,这样或多或少都会不太方便,那么async这个函数就可以将得到的结果保存在future中,然后通过future来获取想要得到的结果。async比起thread来说可以对线程的创建又有了更好的控制,比如可以延迟创建。下面先介绍一下std::future, std::packaged_task, std::promise。
Ch_Zaqdt
2020/02/15
16.3K0
【C++11】std::async函数介绍及问题梳理
🌊2.1 std::async(异步执行) 到 future get 直接调用会如何抛异常
SarPro
2024/05/15
7500
【C++11】std::async函数介绍及问题梳理
学习C++,必须学习的线程知识点
std::thread 是 C++ 标准库中提供的用于创建和管理线程的类。通过 std::thread,可以方便地创建新线程,并在其中执行指定的函数或可调用对象。
Linux兵工厂
2024/04/01
3850
学习C++,必须学习的线程知识点
【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)
阅读此文章前,务必读懂:【Example】C++ 标准库 std::thread 与 std::mutex
芯片烤电池
2022/04/27
1.7K0
C/C++开发基础——std::future与async异步编程
std::future是一个类模板,存放了线程入口函数的返回结果,调用std::future对象的get()函数可以拿到返回结果。
Coder-ZZ
2023/12/18
1.2K0
C/C++开发基础——std::future与async异步编程
C++线程知识点汇总
std::thread 是 C++11 标准库中用于创建和管理线程的类,它提供了一种简单的方式来启动新的线程并执行指定的函数或可调用对象。
Linux兵工厂
2024/04/15
2290
C++线程知识点汇总
跟面试官刚同步异步编程,有她完全够用了
并行化业务逻辑:经常需要频繁的发送,等待,接收其他业务线程的数据,信息交换是常见且高频的行为,这个时候就要开发高效的异步编程了。
用户9831583
2022/06/16
6020
跟面试官刚同步异步编程,有她完全够用了
C++ 异步编程脉络与示例
异步编程是现代软件开发中不可或缺的一部分,尤其是在处理 I/O 操作、网络请求、用户界面响应等需要高并发场景时。C++ 作为一门底层语言,为开发者提供了多种异步编程的工具和方法。本文将系统地探讨 C++ 异步编程的发展历程,从早期的回调方法,到 std::future 和 std::promise,再到现代的协程(coroutines),全面解析各个阶段的特点和使用方法。
巫山老妖
2024/08/05
3130
C++ 异步编程脉络与示例
蓝桥ROS机器人之现代C++学习笔记7.3 期物
学习了如下程序: // future example #include <iostream> // std::cout #include <future> // std::async, std::future #include <chrono> // std::chrono::milliseconds // a non-optimized way of checking for prime numbers: bool is_prime (int x) { f
zhangrelay
2022/04/29
1830
蓝桥ROS机器人之现代C++学习笔记7.3 期物
C++异步future
  std::future是C++11标准库中的⼀个模板类,它表⽰⼀个异步操作的结果。当我们在多线程编程中使⽤异步任务时,std::future可以帮助我们在需要的时候获取任务的执⾏结果。std::future的⼀个重要特性是能够阻塞当前线程,直到异步操作完成,从⽽确保我们在获取结果时不会遇到未完成的操作。
用户11029129
2025/01/27
1260
C++异步future
C++基础 多线程笔记(二)
程序运行结果依然是主线程和子线程各自输出1000条信息以及将信息保存到txt文件中,和上篇中 “死锁 & adopt_lock” 的结果类似,这里不再展示。
xxpcb
2020/08/04
5570
C++协程从入门到精通
协程(coroutine)是一种特殊的函数,它可以被暂停(suspend)、恢复执行(resume),并且一个协程可以被多次调用。C++中的协程属于stackless协程,即协程被suspend时不需要堆栈。C++20开始引入协程,围绕协程实现的相应组件较多,如co_wait、co_return、co_yield,promise,handle等组件,灵活性高,组件之间的关系也略复杂,这使得C++协程学习起来有一定难度。
码事漫谈
2025/05/05
1350
C++协程从入门到精通
【C++11】 让多线程开发变得简单--异步操作
C++ 11中提供了异步操作相关类和函数,不同的类具备不同的功能,总体来说类主要有:std::future,std::promise,std::package_task,函数主要是std::async。
CPP开发前沿
2021/11/16
7400
回调函数实战解读:从 C/C++ 到现代 C++ 实现方案
您好,我是昊天,国内某头部音频公司的C++主程,多年的音视频开发经验,熟悉Qt、FFmpeg、OpenGL。
程序员的园
2025/03/17
1530
回调函数实战解读:从 C/C++ 到现代 C++ 实现方案
《C++11》并发库:简介与应用
在C++11之前,C++并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方库(如Boost.Thread)来创建和管理线程。这些方式存在以下几个问题:
码事漫谈
2025/01/15
1240
《C++11》并发库:简介与应用
UNIX(多线程):12---async、future、packaged_task、promise
【线程1中返回值,线程2调用(promise + future 起连接作用),实现两个线程之间数据传递】
用户3479834
2021/02/03
4790
UNIX(多线程):12---async、future、packaged_task、promise
相关推荐
std future get_waitkey(0)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档