std::promise和std::future用于线程间传递异步结果,生产者通过promise设置值,消费者通过future获取结果,实现解耦与同步。

在C++多线程编程中,std::promise 和 std::future 提供了一种简洁高效的线程间通信方式,用于传递异步操作的结果。一个线程可以通过 std::promise 设置值或异常,另一个线程则通过关联的 std::future 获取该结果,实现解耦与异步等待。
std::promise 是一个可写的一次性容器,用于设置某个值或异常;std::future 是其对应的只读代理,用于在未来某个时间点获取这个值。两者通过共享状态关联。
典型使用流程如下:
以下代码展示主线程启动工作线程执行任务,并通过 promise/future 获取结果:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <thread>
#include <future>
void compute(std::promise<int>&& prom) {
int result = 42; // 模拟耗时计算
prom.set_value(result);
}
int main() {
std::promise<int> prom;
std::future<int> fut = prom.get_future();
std::thread t(compute, std::move(prom));
std::cout << "等待结果...\n";
int value = fut.get(); // 阻塞直到结果可用
std::cout << "得到结果: " << value << "\n";
t.join();
return 0;
}
注意:必须确保 promise 被正确移动,且只能调用一次 set_value,否则会抛出异常。
除了正常值,std::promise 还能传递异常,使消费者端能捕获并处理错误:
void may_fail(std::promise<double>&& prom) {
try {
// 模拟可能失败的操作
throw std::runtime_error("计算失败");
} catch (...) {
prom.set_exception(std::current_exception());
}
}
在调用 future.get() 时,若设置了异常,则该异常会被重新抛出,可在 catch 块中处理。
这种机制适用于需要等待单次异步结果的场景,如:
关键注意事项:
基本上就这些。合理使用 std::promise 和 std::future,可以写出清晰、安全的异步通信代码,避免手动管理互斥量和条件变量的复杂性。
以上就是c++++中std::promise和std::future的配合使用_c++线程间通信与异步结果获取机制的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号