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类