跳转到内容

C++ future 与 promise

来自代码酷
Admin留言 | 贡献2025年4月28日 (一) 21:26的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

C++ future与promise[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

futurepromise是C++11引入的线程同步工具,用于在不同线程间传递异步操作结果。它们提供了一种更高级的线程通信机制,避免了显式使用锁带来的复杂性。

  • promise:生产者线程通过promise对象存储值或异常
  • future:消费者线程通过future对象获取promise设置的值或异常

这种机制实现了线程间的数据通道,特别适合需要返回结果的异步任务场景。

基本用法[编辑 | 编辑源代码]

promise基础[编辑 | 编辑源代码]

promise模板类提供set_value()和set_exception()方法:

#include <iostream>
#include <thread>
#include <future>

void producer(std::promise<int>&& prom) {
    prom.set_value(42);  // 设置值
}

int main() {
    std::promise<int> prom;
    std::future<int> fut = prom.get_future();
    
    std::thread t(producer, std::move(prom));
    
    std::cout << "Received: " << fut.get() << std::endl;
    t.join();
}

输出:

Received: 42

future状态[编辑 | 编辑源代码]

future有三种状态:

  • Deferred:尚未开始的计算
  • Ready:值/异常已就绪
  • Timeout:等待超时

高级特性[编辑 | 编辑源代码]

共享future[编辑 | 编辑源代码]

当多个线程需要等待同一结果时,可使用shared_future:

std::promise<int> prom;
std::shared_future<int> shared_fut = prom.get_future().share();

// 多个线程可以复制shared_future并调用get()

异常传递[编辑 | 编辑源代码]

promise可以传递异常:

try {
    // 可能抛出异常的代码
} catch(...) {
    prom.set_exception(std::current_exception());
}

实际案例[编辑 | 编辑源代码]

并行计算[编辑 | 编辑源代码]

计算斐波那契数列的并行实现:

int fib(int n) {
    if (n < 2) return n;
    return fib(n-1) + fib(n-2);
}

int parallel_fib(int n) {
    std::promise<int> prom;
    auto fut = prom.get_future();
    
    std::thread([&prom, n]{
        prom.set_value(fib(n));
    }).detach();
    
    return fut.get();
}

任务管道[编辑 | 编辑源代码]

使用future实现生产者-消费者模式:

graph LR Producer-->|promise|Channel Channel-->|future|Consumer

时间约束操作[编辑 | 编辑源代码]

future支持超时等待:

auto status = fut.wait_for(std::chrono::seconds(1));
if (status == std::future_status::ready) {
    // 操作完成
}

数学表达[编辑 | 编辑源代码]

future/promise可视为单值通信通道:

promiseset_valuefuturegetvalue

最佳实践[编辑 | 编辑源代码]

  • 避免多次调用get(),会导致未定义行为
  • 使用std::async简化future创建
  • 对共享结果使用shared_future
  • 总是处理可能的异常

总结[编辑 | 编辑源代码]

future/promise机制提供了:

  • 线程安全的异步结果传递
  • 异常传播能力
  • 灵活的等待策略
  • 比条件变量更高级的抽象

正确使用可以显著简化多线程程序的设计,同时保持高效性和安全性。