C++ future 与 promise
外观
C++ future与promise[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
future和promise是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实现生产者-消费者模式:
时间约束操作[编辑 | 编辑源代码]
future支持超时等待:
auto status = fut.wait_for(std::chrono::seconds(1));
if (status == std::future_status::ready) {
// 操作完成
}
数学表达[编辑 | 编辑源代码]
future/promise可视为单值通信通道:
最佳实践[编辑 | 编辑源代码]
- 避免多次调用get(),会导致未定义行为
- 使用std::async简化future创建
- 对共享结果使用shared_future
- 总是处理可能的异常
总结[编辑 | 编辑源代码]
future/promise机制提供了:
- 线程安全的异步结果传递
- 异常传播能力
- 灵活的等待策略
- 比条件变量更高级的抽象
正确使用可以显著简化多线程程序的设计,同时保持高效性和安全性。