std::async概念和使用方法
std::async
是 C++ 标准库中的一个函数模板,用于启动一个异步任务,并返回一个std::future
对象,该对象可用于获取异步任务的结果。
1、概念
std::async
允许你以异步的方式执行一个函数或者可调用对象,它会在后台启动一个新的线程或者利用其他可用的异步执行机制来执行指定的任务。通过std::future
对象,你可以在将来的某个时间点获取异步任务的结果,或者检查任务是否已经完成。
2、使用方法
- 包含头文件
#include <future>
- 基本用法
#include <iostream>#include <future>int add(int a, int b) {return a + b;}int main() {// 使用 std::async 启动异步任务std::future<int> result = std::async(add, 3, 4);// 获取异步任务的结果int sum = result.get();std::cout << "The sum is: " << sum << std::endl;return 0;}
在这个例子中,std::async(add, 3, 4)
启动了一个异步任务来执行函数add(3, 4)
,并返回一个std::future<int>
对象。然后,通过调用result.get()
来获取异步任务的结果。如果异步任务还没有完成,result.get()
会阻塞当前线程,直到任务完成并返回结果。
2.1 指定启动策略
-
std::async
可以接受一个额外的参数来指定启动策略,有以下两种策略可选:std::launch::async
:强制异步启动,即一定会在单独的线程中执行任务。std::launch::deferred
:延迟执行,只有在调用std::future
对象的get
或wait
成员函数时才执行任务,并且可能在调用线程中执行。
std::future<int> result1 = std::async(std::launch::async, add, 3, 4);std::future<int> result2 = std::async(std::launch::deferred, add, 3, 4);
2.2 异常处理
- 如果异步任务抛出异常,调用
std::future
对象的get
成员函数时会重新抛出该异常。
#include <iostream>#include <future>int divide(int a, int b) {if (b == 0) {throw std::runtime_error("Division by zero");}return a / b;}int main() {std::future<int> result = std::async(divide, 10, 0);try {int quotient = result.get();std::cout << "The quotient is: " << quotient << std::endl;} catch (const std::exception& e) {std::cout << "Caught an exception: " << e.what() << std::endl;}return 0;}
std::async
提供了一种方便的方式来执行异步任务并获取结果,但在使用时需要注意线程安全、资源管理和异常处理等问题。