在C++中,std::async
是一个用于异步编程的工具,它允许你在一个单独的线程中执行任务,并返回一个 std::future
对象,通过这个对象可以获取任务的结果或者检查任务的状态。
基本用法1
lambda 表达式
#include <iostream>
#include <future>
#include <chrono>
int main() {
// 使用 std::async 创建一个异步任务
auto future_result = std::async(std::launch::async, []{
std::cout << "Task is running in a separate thread." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42; // 返回值
});
// 主线程继续执行其他操作
std::cout << "Main thread continues to execute." << std::endl;
// 等待异步任务完成并获取结果
int result = future_result.get();
std::cout << "Result from async task: " << result << std::endl;
return 0;
}
解释
std::launch::async
: 强制任务在独立的线程中运行。std::launch::deferred
: 延迟执行任务,直到调用future::get()
或future::wait()
。std::launch::async | std::launch::deferred
: 允许实现选择如何执行任务(默认行为)。
基本用法2
基本函数及传入函数值
#include <iostream>
#include <future>
#include <chrono>
// 定义一个简单的异步函数
int calculate(int x) {
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时操作
return x * x; // 返回平方值
}
int main() {
// 使用 std::async 启动异步任务
auto future_result = std::async(std::launch::async, calculate, 5);
// 主线程继续执行其他操作
std::cout << "Main thread continues to execute." << std::endl;
// 等待异步任务完成并获取结果
try {
int result = future_result.get(); // 获取异步任务的返回值
std::cout << "Result from async task: " << result << std::endl;
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << std::endl;
}
return 0;
}
输出示例
Main thread continues to execute.
Task is running in a separate thread.
Result from async task: 25
解释
- 异步函数定义:
calculate
是一个普通的函数,接受一个整数参数并返回其平方值。 - 启动异步任务: 使用
std::async
启动异步任务,传入calculate
函数及其参数5
。 - 主线程继续执行: 在等待异步任务完成的同时,主线程可以继续执行其他操作。
- 获取结果: 使用
future_result.get()
等待异步任务完成并获取返回值。
特点
- 线程管理:
std::async
自动管理线程生命周期,简化了多线程编程。 - 结果获取: 可以通过
std::future
获取异步任务的结果。 - 异常处理: 如果异步任务抛出异常,可以通过
std::future
的get()
方法捕获。
注意事项
std::async
并不保证一定创建新线程,具体行为取决于实现和参数设置。使用
std::future
的get()
方法可能会阻塞当前线程,直到异步任务完成。异常处理: 如果异步任务抛出异常,
future::get()
会重新抛出该异常,因此建议使用try-catch
块来捕获异常。线程安全: 如果多个线程访问共享资源,确保采取适当的同步措施。