C++11异步编程 --- async和future
C++11引入了async
和future
机制,用于简化异步编程和并发操作。这两个组件位于<future>
头文件中,提供了高级的异步任务管理接口。
一、async
1.定义
std::async
std::async
是一个函数模板,用于启动一个异步任务。它返回一个std::future
对象,该对象可以用来获取异步任务的结果。std::async
的执行方式可以通过std::launch
策略来控制。如下:
c++
future<int> myf = async(launch::async,Func,20,30);
2.主要功能
①启动一个异步任务,返回一个future对象。
②启动策略:
c++
EXPORT_STD enum class launch { // names for launch options passed to async
async = 0x1,
deferred = 0x2
};
launch::async :强制在新线程中启动异步任务。
launch::deferred:延迟执行,只有当future的get()或者wait函数被调用时,任务才会在调用线程中执行。
默认策略(不指定) - 由实现决定,可能是异步或延迟
二、future
1.定义:
future是一个类模板,用于存储异步执行结果,它提供了一种机制,允许用户在某个异步操作完成时获取其结果。std::future
对象可以与线程、异步任务或其他并发操作相关联。
2.主要功能
①通过std::future
的get()
方法,可以获取异步操作的结果。如果异步操作尚未完成,get()
会阻塞当前线程,直到结果可用。
②它提供了以下主要方法:
get()
- 获取结果(如果结果未准备好会阻塞)wait()
- 等待结果可用(阻塞但不获取结果)wait_for()
/wait_until()
- 带超时的等待valid()
- 检查future是否关联了共享状态
三、 std::async
和std::future
的使用场景
1.异步任务处理:适用于需要在后台执行耗时操作,而主线程可以继续执行其他任务的场景。
2.多线程数据共享:通过std::future
获取异步任务的结果,避免了直接使用线程时可能出现的线程同步问题。
3.简化并发编程:提供了一种简洁的方式来实现异步任务的启动和结果获取,降低了并发编程的复杂性。
四、注意事项:
1.如果不保留async
返回的future对象,其析构函数会阻塞等待任务完成(类似于隐式join)。
2.线程安全:std::future
和std::async
是线程安全的,但用户需要确保在使用std::future
的get()
方法时,不会出现对同一std::future
对象的多次调用,future::get()
只能调用一次,调用后future变为无效。
3.资源管理:std::future
对象在析构时会自动销毁关联的异步任务,但如果任务尚未完成,可能会导致资源泄漏或未定义行为。
4.性能考虑:虽然std::async
可以自动选择执行策略,但在某些情况下,显式指定std::launch::async
或std::launch::deferred
可以更好地控制任务的执行方式,从而优化性能。
示例代码:
C++
#include <iostream>
#include<thread>
#include<future>
using namespace std;
int Func(int a,int b)
{
cout << "Sub thread ID:" << this_thread::get_id() << endl;
cout << "this is MyFunc" << endl;
return a + b;
}
int main()
{
future<int> myf = async(launch::async,Func,20,30);
cout <<"Main Thread Id:"<< this_thread::get_id() << endl;
myf.wait();
cout<<"myf == " << myf.get()<< endl;
std::cout << "Hello World!\n";
}
代码运行结果:

好了,关于async和future的介绍就到这里了。