前言
std::future
是 C++11 引入的一个非常有用的特性,它提供了一种机制来访问异步操作的结果。当你启动一个异步任务时,比如通过 std::async
方式,该方式会返回一个 std::future
对象,这个对象代表了异步操作的结果。可以查询这个 std::future
对象以获取异步操作的结果,或者检查异步操作是否已经完成。
特性
- std::future存储了异步操作的结果;
- std::future仅支持一次异步操作结果的访问。一旦从std::future对象中获取了结果,就不能再被用来获取结果;
- 可以使用
std::future::wait()
方法等待异步操作完成,但这个方法不会返回结果; - 使用
std::future::get()
方法可以获取异步操作的结果,但这个方法会阻塞调用线程直到异步操作完成,并且只能被调用一次; - 通过
std::future::wait_for()
或std::future::wait_until()
方法,可以检查异步操作是否在给定的时间段内完成;
代码示例
#include <iostream>
#include <future>
#include <chrono>
int compute_value(int x)
{
// 模拟一个耗时的计算
std::this_thread::sleep_for(std::chrono::seconds(1));
return x * x;
}
int main()
{
// 启动一个异步任务
std::future<int> result = std::async(std::launch::async, compute_value, 42);
// 等待异步任务完成并获取结果
int value = result.get();
// 这会阻塞,直到异步任务完成
std::cout << "The result is " << value << std::endl;
return 0;
}
代码中,我们使用std::async
来完成执行函数compute_value
的异步操作,并使用get()
函数来阻塞式获取执行结果;
注意事项
std::future
对象不能被复制,但可以被移动。这意味着你可以将std::future
对象从一个作用域移动到另一个作用域,但不能同时拥有两个指向相同异步结果的std::future
对象。- 异步操作的结果只能被获取一次。一旦你调用了
get()
方法,std::future
对象就变成了无效状态,再次调用get()
会导致未定义行为。