【C++】future

在 C++ 标准库中,std::future 是并发编程的重要组件,定义于 <future> 头文件,主要用于获取异步操作的结果。它通常与 std::asyncstd::promisestd::packaged_task 等配合使用,实现对异步任务的管理和结果获取。

std::future 包含的核心内容

  1. 状态管理
    std::future 内部维护一个异步操作的状态(未就绪/就绪/已失效),用于跟踪关联任务的执行情况。

  2. 结果获取方法

    • get():阻塞当前线程,直到异步操作完成并返回结果(仅能调用一次,调用后状态变为“已失效”)。
    • wait():阻塞当前线程,直到异步操作完成,但不获取结果。
    • wait_for(duration):阻塞当前线程,最多等待指定时长,返回状态(ready/timeout/deferred)。
    • wait_until(time_point):阻塞当前线程,直到指定时间点,返回状态同上。
  3. 状态查询

    • valid():判断 future 是否与一个有效的异步操作关联(未调用 get() 且任务未失效)。

std::future 能实现的核心功能

  1. 获取异步任务结果
    通过 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;
    }
    
  2. 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;
    }
    
  3. 处理延迟计算( deferred 任务)
    std::asyncstd::launch::deferred 策略启动时,任务会延迟到 future.get()wait() 被调用时才执行(在当前线程同步执行)。

  4. 异常传递
    若异步任务抛出异常,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++ 异步编程的核心接口,简化了异步任务的结果获取和线程间通信,是实现高效并发的重要工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ray.so

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值