std::future 和异步编程相关的功能是在 C++11 标准中引入的。std::future是C++中的一个模板类,代表一个将来的值,即一个可能尚不可用的值,用于并发编程中,以检索异步操作的结果。当你启动一个异步操作时,它会返回一个std::future对象,该对象最终将持有该操作的结果。你可以使用这个对象来查询值是否准备就绪,等待值变为就绪,并在值就绪后检索值。
1. 创建std::future
通过启动返回值的异步任务通常可以获得std::future对象。这可以通过使用std::async、std::packaged_task等函数完成,或者通过直接与std::promise对象关联。
2. 代码示例(使用std::async)
#include <future>
#include <iostream>
int compute() {
// 模拟一些计算
return 42;
}
int main() {
// 启动一个异步任务
std::future<int> result = std::async(compute);
// 在'compute'在另一个线程运行时,这里可以做其他工作...
// 获取结果(这将阻塞,直到结果就绪)
std::cout << "答案是 " << result.get() << std::endl;
return 0;
}
3. std::future的操作
- get(): 从std::future中检索值。如果值尚不可用,此调用将阻塞,直到值变得可用。一旦调用了get(),std::future就不能再用来get()值了;它变得无效。
- wait(): 阻塞直到结果变得可用。与get()不同,wait()不检索结果。
- wait_for(): 在等待结果变得可用时阻塞指定的持续时间。
- wait_until(): 在等待结果变得可用时阻塞到指定的时间点。
- valid(): 检查std::future是否有共享状态。这在调用get()之前检查std::future是否有效且没有被移动很有用。
总结
- std::future提供了访问异步操作结果的机制。
- 它对于并发编程特别有用,允许主线程在另一个线程执行操作时继续执行而不阻塞。
- 必须确保在状态有效的情况下(valid()==true)调用std::future的get(),否则可能导致未定义行为。
- std::future只能被移动,不能被复制,确保只有一个线程可以检索异步操作的结果。