1 概念
std::future
是 C++ 标准库中<future>
头文件提供的一个模板类,用于异步操作的结果获取。它提供了一种访问异步操作结果的机制,通常与std::async
、std::packaged_task
或std::promise
一起使用。- 异步操作可以在另一个线程中执行,
std::future
对象允许当前线程在需要的时候获取异步操作的结果,并且可以检查异步操作是否已经完成。
2 使用方法
1. 包含头文件
在使用std::future
之前,需要包含<future>
头文件:
#include <future>
2. 与std::async
一起使用
std::async
会自动创建一个新的线程或者在当前线程的空闲时间执行异步任务,并返回一个std::future
对象来保存任务的结果。
#include <iostream>
#include <future>
int add(int a, int b)
{
return a + b;
}
int main()
{
// 异步执行add函数,返回一个std::future对象
std::future<int> result = std::async(add, 3, 4);
// 获取异步操作的结果,如果任务还没有完成,会阻塞当前线程直到任务完成
int sum = result.get();
std::cout << "Result: " << sum << std::endl;
return 0;
}
3. 与std::packaged_task
一起使用
std::packaged_task
将一个可调用对象(如函数、函数对象等)包装起来,使其可以异步执行,然后可以通过get_future
方法获取对应的std::future
对象。
#include <iostream>
#include <future>
int add(int a, int b)
{
return a + b;
}
int main()
{
std::packaged_task<int(int, int)> task(add);
std::future<int> result = task.get_future();
// 可以在另一个线程中执行task
task(3, 4);
int sum = result.get();
std::cout << "Result: " << sum << std::endl;
return 0;
}
4. 与std::promise
一起使用
std::promise
用于在一个线程中设置一个值(或者异常),然后在另一个线程中通过与之关联的std::future
对象来获取这个值(或者异常)。
#include <iostream>
#include <future>
int main()
{
std::promise<int> prom;
std::future<int> result = prom.get_future();
// 在另一个线程中可以执行如下操作
// prom.set_value(10);
int value = result.get();
std::cout << "Value: " << value << std::endl;
return 0;
}
std::future
在多线程编程中非常有用,它可以帮助你更好地管理异步任务的结果,避免了手动管理线程和同步机制的复杂性。