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
提供了异常传递的能力,增强了代码的健壮性。
热门推荐
绘画专业毕业生就业指南:16种职业方向详解
麦迪斯壁挂炉:冬季保暖神器的保养秘籍
冬季来临,林内壁挂炉清洁保养全攻略
脚气(足癣)的症状、危害与预防方法全解析
黑巧控糖新趋势:糖尿病患者的福音?
水煮鹰嘴豆:糖尿病患者的健康零食新宠!
哈佛研究:黑巧克力真的能降糖吗?
景迈山翁基古寨:千年布朗族的隐秘仙境
景迈山上的翁基布朗族古寨:千年的茶香传奇
景迈山申遗成功:翁基古寨的绝美风光与人文魅力
探秘景迈山上的千年布朗古寨
老有所养,做大做优银发经济
郑州:去年常住人口1274.20万人,全国城市排名第11
游戏缺失steam_api64.dll无法运行的几种解决方法
绝地求生PUBG进游戏就闪退大厅/进游戏就报错解决办法来了
《城中之城》停播背后:剧情争议、专业性缺失引发的连锁反应
西浦博士项目助推苏州园区经济腾飞
西交利物浦大学2024-2025学年博士申请攻略:全奖机会大揭秘
硒片防癌新发现:科学揭秘其神奇功效
你真的会用红花油吗?这些使用禁忌和注意事项请收好
NBA球员薪资排行榜(最新数据展示NBA球员薪水差异惊人,引发争议与热议)
王者荣耀S38赛季必玩:关羽、姬小满、女娲新手攻略
王者荣耀S38赛季必学:五大顶级脏套路揭秘!
当春晚响起这段旋律,网友们再也坐不住了……
壁挂炉使用全攻略:从温度调节到安全注意事项
健康生活新潮流:助你学习动力满满!
高铁商务座到底有多舒服?亲测告诉你!
职场焦虑下的终身学习:如何保持动力?
在职人士如何提升学习动力?从时间管理到克服拖延的实用指南
糖尿病患者如何挑选无糖乳品?