在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
块来捕获异常。 -
线程安全: 如果多个线程访问共享资源,确保采取适当的同步措施。