admin管理员组文章数量:1037775
std::future类
1. 引入头文件
使用std::future需要包含<future>头文件:
#include <future>
2. 创建std::future对象
通常通过std::async函数来创建一个std::future对象,std::async用于启动一个异步任务。例如:
代码语言:javascript代码运行次数:0运行复制#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运行复制#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运行复制#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 删除异步异常std对象函数std::future类
1. 引入头文件
使用std::future需要包含<future>头文件:
#include <future>
2. 创建std::future对象
通常通过std::async函数来创建一个std::future对象,std::async用于启动一个异步任务。例如:
代码语言:javascript代码运行次数:0运行复制#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运行复制#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运行复制#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 删除异步异常std对象函数本文标签: stdfuture类
版权声明:本文标题:std::future类 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748278261a2278955.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论