在 C++ 标准库中,std::future 是并发编程的重要组件,定义于 <future> 头文件,主要用于获取异步操作的结果。它通常与 std::async、std::promise、std::packaged_task 等配合使用,实现对异步任务的管理和结果获取。
std::future 包含的核心内容
-
状态管理
std::future内部维护一个异步操作的状态(未就绪/就绪/已失效),用于跟踪关联任务的执行情况。 -
结果获取方法
get():阻塞当前线程,直到异步操作完成并返回结果(仅能调用一次,调用后状态变为“已失效”)。wait():阻塞当前线程,直到异步操作完成,但不获取结果。wait_for(duration):阻塞当前线程,最多等待指定时长,返回状态(ready/timeout/deferred)。wait_until(time_point):阻塞当前线程,直到指定时间点,返回状态同上。
-
状态查询
valid():判断future是否与一个有效的异步操作关联(未调用get()且任务未失效)。
std::future 能实现的核心功能
-
获取异步任务结果
通过std::async启动异步任务时,会返回一个std::future对象,用于后续获取任务的返回值。
示例:#include <future> #include <iostream> int compute() { return 42; } int main() { std::future<int> fut = std::async(compute); // 异步执行compute int result = fut.get(); // 阻塞等待结果,获取42 std::cout << result << std::endl; return 0; } -
与
std::promise配合传递结果
std::promise用于在一个线程中设置结果,std::future在另一个线程中获取该结果,实现线程间通信。
示例:#include <future> #include <thread> #include <iostream> void set_value(std::promise<int>& prom) { prom.set_value(100); // 设置结果 } int main() { std::promise<int> prom; std::future<int> fut = prom.get_future(); // 关联future和promise std::thread t(set_value, std::ref(prom)); t.join(); std::cout << fut.get() << std::endl; // 获取结果100 return 0; } -
处理延迟计算( deferred 任务)
当std::async以std::launch::deferred策略启动时,任务会延迟到future.get()或wait()被调用时才执行(在当前线程同步执行)。 -
异常传递
若异步任务抛出异常,std::future会捕获该异常,在调用get()时重新抛出,便于在主线程中统一处理。
示例:#include <future> #include <iostream> void throw_exception() { throw std::runtime_error("Task failed"); } int main() { std::future<void> fut = std::async(throw_exception); try { fut.get(); // 重新抛出异常 } catch (const std::exception& e) { std::cout << "Caught: " << e.what() << std::endl; } return 0; }
注意事项
std::future是“一次性”的:调用get()后,future状态失效,无法再次获取结果。- 若需多次获取结果或在多个线程中等待,可使用
std::shared_future(通过future.share()转换得到)。 - 需避免
future关联的异步任务未执行就销毁(可能导致资源泄漏或程序异常)。
总之,std::future 是 C++ 异步编程的核心接口,简化了异步任务的结果获取和线程间通信,是实现高效并发的重要工具。



1112

被折叠的 条评论
为什么被折叠?



