std::future和std::promise详解
创作时间:
作者:
@小白创作中心
std::future和std::promise详解
引用
CSDN
1.
https://m.blog.csdn.net/xie__jin__cheng/article/details/144624212
概要
std::future 和 std::promise 是 C++11 引入的标准库组件,用于实现线程间的同步和通信。它们提供了一种机制,允许一个线程设定某个值(通过 std::promise),而另一个线程可以等待这个值并获取它(通过 std::future)。这在线程间传递结果或异常时非常有用。
内容
std::promise
std::promise 用于设置一个共享状态的值,这个值可以在将来被 std::future 获取。主要成员函数有:
set_value(T value):设置共享状态的值。set_exception(std::exception_ptr e):设置共享状态的异常。get_future():返回一个与std::promise共享状态的std::future对象。
std::future
std::future 用于访问共享状态的值或异常。主要成员函数有:
get():获取共享状态的值。如果值还未被设置,则阻塞直到值被设置。如果共享状态存储了一个异常,则get()会重新抛出这个异常。wait():阻塞直到共享状态的值被设置或存储了一个异常。wait_for(duration):阻塞直到指定的时间段过去或共享状态的值被设置。wait_until(time_point):阻塞直到指定的时间点或共享状态的值被设置。valid():检查std::future是否有共享状态。
使用示例
以下是一个简单的示例,展示了如何使用 std::promise 和 std::future 在线程间传递结果:
#include <iostream>
#include <thread>
#include <future>
void threadFunction(std::promise<int> promiseObj) {
std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟一些工作
promiseObj.set_value(10); // 设置共享状态的值
}
int main() {
// 创建一个 promise 对象
std::promise<int> promiseObj;
// 获取与 promise 共享状态的 future 对象
std::future<int> futureObj = promiseObj.get_future();
// 创建一个线程并传递 promise 对象
std::thread th(threadFunction, std::move(promiseObj));
// 等待并获取共享状态的值
std::cout << "Value: " << futureObj.get() << std::endl;
// 等待线程结束
th.join();
return 0;
}
在这个示例中:
- 主线程创建了一个
std::promise<int>对象。 - 通过
promiseObj.get_future()获取一个std::future<int>对象。 - 创建并启动一个新线程,将
std::promise<int>对象(通过std::move移动)传递给新线程。 - 新线程执行一些工作(模拟为睡眠2秒),然后通过
promiseObj.set_value(10)设置共享状态的值。 - 主线程通过
futureObj.get()获取共享状态的值,并输出它。 - 主线程等待新线程结束。
这种机制使得线程间的结果传递变得简单和直观,并且 std::future 和 std::promise 提供了异常传递的能力,增强了代码的健壮性。
热门推荐
1981年属鸡2月:金饰与翡翠手链的佩戴选择及其适宜性分析
电脑系统如何做成VM虚拟机
如何进行组合式理财产品的投资策略
《第五人格》黑屏闪退怎么办?全方位解决方案来了!
易寒体质怎么调理
卡萨布兰卡20大景点全攻略
《解限机》全机甲技能及特性介绍 机甲武装属性及进阶技巧
西班牙语到底有多难?从母语到学习方法的全面解析
原来,偷偷做着“计算”的大自然会钟爱这样一组数……
如何识别织物起球
毛衣起球怎么办?专业解析起球原因与7大实用处理技巧
猕猴桃在北方种植技术
不同剂型的药品开封后使用期限,这篇文章总结全了!
不同剂型的药品开封后使用期限,这篇文章总结全了!
2025物化生本科分数线:最低多少分能上(全国各省汇总)
济南长清:以"执破融合"改革"小切口" 助推营商环境"大提升"
深化“光盘行动” 让反浪费成为个人行动自觉
杜甫春望的写作背景是什么
杜甫《春望》全诗翻译与赏析
“跨了个周末,包裹全部超时收费!”市民质疑快递柜收费不合理,律师这样说
故乡的血豆腐:一道承载时光记忆的传统美食
报考公务员都需要什么个人资料
十万块钱的车子,你知道一年养车费用要多少吗?买车前一定考虑好
贵宾犬——优雅的宠物选择(探究贵宾犬的品种、特点和饲养技巧)
无穷大并不等于无穷大:数学中的无限与不确定性
硫辛酸是什么?功效与食物来源全解析
力量训练一小时消耗热量是多少?力量训练消耗热量表
比亚迪理想小米们2025年的战争主线
从历史典籍中提炼的20条生存法则、20条规律、10条逻辑
噪音扰民有时间限制吗