Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
C++的std::promise和std::future怎么用_C++线程通信与结果传递机制解析_创想鸟

C++的std::promise和std::future怎么用_C++线程通信与结果传递机制解析

std::promise用于设置值或异常,std::future用于获取结果,二者通过共享状态实现线程间通信;一个线程调用promise的set_value()或set_exception(),另一个线程通过future的get()阻塞等待结果,支持超时检查与异常传递,是C++异步编程的基础机制。

c++的std::promise和std::future怎么用_c++线程通信与结果传递机制解析

在C++多线程编程中,std::promise 和 std::future 提供了一种简洁高效的线程间通信和异步结果传递机制。它们常用于一个线程执行任务后,将结果安全地传递给另一个等待结果的线程。

基本概念:什么是 std::promise 与 std::future?

std::promise 是一个可写一次的“容器”,用于设置某个值或异常;而 std::future 是其对应的只读“句柄”,用于获取这个值。两者通过共享状态关联,实现线程间的解耦通信。

一个线程通过 promise 设置结果,另一个线程通过 future 获取该结果,如果结果尚未准备好,future 的 get() 调用会阻塞直到结果可用。

基本使用方法

下面是一个简单的例子,展示如何使用 promise 和 future 在两个线程之间传递整数结果:

立即学习“C++免费学习笔记(深入)”;

#include #include #include void compute(std::promise&& prom) {    int result = 42;    // 模拟耗时计算    std::this_thread::sleep_for(std::chrono::seconds(1));    // 将结果存入 promise    prom.set_value(result);}int main() {    std::promise prom;    std::future fut = prom.get_future(); // 获取对应的 future    std::thread t(compute, std::move(prom));    std::cout << "等待结果...n";    int value = fut.get(); // 阻塞,直到结果就绪    std::cout << "得到结果: " << value << "n";    t.join();    return 0;}

在这个例子中:

主线程创建了 promise 并从中获取 future。 新线程接收 promise 的右值引用(通过 move),完成计算后调用 set_value() 设置结果。 主线程调用 future 的 get() 获取结果,自动阻塞等待。

异常传递

除了正常值,promise 还可以传递异常。这使得被调用方能通知调用方发生了错误。

void might_fail(std::promise&& prom) {    try {        // 模拟可能出错的操作        throw std::runtime_error("计算失败");    } catch (...) {        // 捕获异常并存储到 promise        prom.set_exception(std::current_exception());    }}int main() {    std::promise prom;    std::future fut = prom.get_future();    std::thread t(might_fail, std::move(prom));    try {        double val = fut.get(); // 这里会重新抛出异常    } catch (const std::exception& e) {        std::cout << "捕获异常: " << e.what() << "n";    }    t.join();    return 0;}

当调用 fut.get() 时,若内部存储的是异常,则 get() 会重新抛出该异常,便于上层处理。

非阻塞检查与超时等待

如果不想一直阻塞,可以使用 wait_for 或 wait_until 对 future 进行限时等待。

std::future fut = prom.get_future();auto status = fut.wait_for(std::chrono::milliseconds(500));if (status == std::future_status::ready) {    std::cout << "结果已就绪: " << fut.get() << "n";} else {    std::cout << "结果未准备好n";}

支持的状态包括:

ready:结果已设置。 timeout:超时仍未就绪。 deferred:任务延迟执行(如使用 std::launch::deferred)。

与 std::async 的关系

std::async 内部也使用了 promise/future 机制。当你调用 async,它会返回一个 future,后台可能启动线程执行任务,并通过 promise 自动设置结果。

例如:

auto fut = std::async([](){ return 84; });std::cout << fut.get() << "n"; // 输出 84

这相当于手动创建线程 + promise 的简化版。

基本上就这些。std::promise 和 std::future 是 C++ 中实现异步操作和线程通信的重要工具,理解它们有助于写出更清晰、安全的并发代码。关键是记住:promise 是“生产者”,future 是“消费者”,数据只能传递一次,且线程安全。不复杂但容易忽略细节,比如移动语义和异常处理。

以上就是C++的std::promise和std::future怎么用_C++线程通信与结果传递机制解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1481204.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++中的const成员函数是什么意思_c++ const函数修饰与应用说明
上一篇 2025年12月19日 05:17:12
c++中unordered_map和map有什么区别_c++哈希表与红黑树容器对比
下一篇 2025年12月19日 05:17:30

相关推荐

  • java如何使用Calendar类进行日期计算 javaCalendar日期计算的详细指南方法​

    java如何使用Calendar类进行日期计算 javaCalendar日期计算的详细指南方法​java如何使用Calendar类进行日期计算 javaCalendar日期计算的详细指南方法​java如何使用Calendar类进行日期计算 javaCalendar日期计算的详细指南方法​java如何使用Calendar类进行日期计算 javaCalendar日期计算的详细指南方法​

    calendar与date的主要区别是:date表示时间线上的一个瞬间(毫秒数),而calendar提供结构化的日期字段操作并支持时区和日历系统;2. 转换方式为:calendar通过gettime()转date,date通过settime(date)转calendar;3. 常见陷阱包括:月份从0…

    2026年10月3日 • 用户投稿
    100
  • win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法

    win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法

    答案:通过离线源、.cab包或修改注册表与服务可解决Windows 11安装.NET Framework 3.5失败问题。具体步骤依次为使用DISM命令指定ISO镜像sxs文件夹、采用.cab文件作为本地源安装,以及禁用Windows Update相关策略后重试内置功能启用。 如果您尝试在Windo…

    2026年10月3日 • 用户投稿
    100
  • Grok 2.5— xAI正式开源的AI模型,前身是Grok 2

    Grok 2.5— xAI正式开源的AI模型,前身是Grok 2Grok 2.5— xAI正式开源的AI模型,前身是Grok 2Grok 2.5— xAI正式开源的AI模型,前身是Grok 2Grok 2.5— xAI正式开源的AI模型,前身是Grok 2

    Grok 2.5是什么 grok 2.5 是埃隆·马斯克旗下 xai 公司开源的人工智能模型。模型文件可在 hugging face 下载,包含 42 个文件,总大小约 500gb,需 8 张显存超 40gb 的 gpu 才能运行。开源采用 grok 2 社区许可证协议,允许非商业与年收入低于 10…

    2026年10月3日 • 用户投稿
    100
  • java怎样处理异常避免程序崩溃 java异常处理的详细操作教程​

    java怎样处理异常避免程序崩溃 java异常处理的详细操作教程​java怎样处理异常避免程序崩溃 java异常处理的详细操作教程​java怎样处理异常避免程序崩溃 java异常处理的详细操作教程​java怎样处理异常避免程序崩溃 java异常处理的详细操作教程​

    java程序避免崩溃的核心是合理使用try-catch-finally结构捕获和处理异常,其中try块包裹可能出错的代码,catch块处理特定异常,finally块确保资源释放;2. 通过throws声明检查型异常以传递处理责任,throw用于手动抛出异常,如参数校验失败时;3. 自定义异常可提升业…

    2026年10月3日 • 用户投稿
    100
  • Ring-lite— 蚂蚁技术开源的轻量级推理模型

    Ring-lite— 蚂蚁技术开源的轻量级推理模型Ring-lite— 蚂蚁技术开源的轻量级推理模型Ring-lite— 蚂蚁技术开源的轻量级推理模型Ring-lite— 蚂蚁技术开源的轻量级推理模型

    ring-lite是蚂蚁技术anttech团队推出的基于moe架构的轻量级推理模型。该模型以ling-lite-1.5为基底,结合独创的c3po强化学习训练方法,在多个推理benchmark中达到sota水平,仅需2.75b激活参数。ring-lite通过稳定强化学习训练、优化long-cot sf…

    2026年10月3日 • 用户投稿
    000
  • c盘里哪些文件夹不能动_C盘重要文件夹介绍与勿删建议

    不能删除C盘中的系统关键文件夹,否则会导致系统崩溃或数据丢失。1. Windows文件夹含系统核心文件,删除将导致无法启动;2. Program Files及Program Files (x86)为软件默认安装目录,删除会使所有程序失效;3. Users文件夹保存个人数据和设置,误删会造成个人信息永…

    2026年10月3日
    100
  • Runway 生成动态视频?关键帧控制与转场技巧​

    Runway 生成动态视频?关键帧控制与转场技巧​Runway 生成动态视频?关键帧控制与转场技巧​Runway 生成动态视频?关键帧控制与转场技巧​Runway 生成动态视频?关键帧控制与转场技巧​

    runway 通过提示词动画实现关键帧控制,用户可在时间轴上设置不同提示词及强度以生成动态效果;例如在第 0 秒使用 “a cat”、第 5 秒使用 “a dog” 并调整强度实现渐变过渡;同时支持相机运动设置,如平移、缩放与旋转;由于其关键帧功能有限…

    2026年10月3日 • 用户投稿
    300
  • Bing浏览器怎么设置启动页_Bing浏览器启动页面自定义方法

    Bing浏览器怎么设置启动页_Bing浏览器启动页面自定义方法Bing浏览器怎么设置启动页_Bing浏览器启动页面自定义方法Bing浏览器怎么设置启动页_Bing浏览器启动页面自定义方法Bing浏览器怎么设置启动页_Bing浏览器启动页面自定义方法

    可通过设置自定义启动页实现Bing浏览器自动跳转指定网页:一、在浏览器设置中选择“打开特定页面”,添加目标网址;二、修改浏览器快捷方式属性,在目标路径后附加网址参数;三、通过注册表编辑器定位浏览器主键,设置“Start Page”字符串值为目标地址;四、企业环境中使用组策略管理编辑器配置用户策略,统…

    2026年10月3日 • 用户投稿
    100
  • 深入理解Java装饰器模式与内部方法调用策略

    深入理解Java装饰器模式与内部方法调用策略深入理解Java装饰器模式与内部方法调用策略深入理解Java装饰器模式与内部方法调用策略深入理解Java装饰器模式与内部方法调用策略

    本文旨在探讨Java装饰器模式在处理对象内部方法调用时的局限性,特别是当被装饰对象的内部“辅助方法”需要被装饰器行为影响时所面临的挑战。我们将通过具体代码示例,阐明装饰器模式的工作原理及其适用场景,并提出一种基于继承的替代方案,以有效解决内部方法调用行为的扩展需求,帮助开发者在面对不同设计需求时,选…

    2026年10月3日 • 用户投稿
    300
  • win10系统占用C盘空间过大怎么办_系统盘瘦身与空间清理方法

    win10系统占用C盘空间过大怎么办_系统盘瘦身与空间清理方法win10系统占用C盘空间过大怎么办_系统盘瘦身与空间清理方法win10系统占用C盘空间过大怎么办_系统盘瘦身与空间清理方法win10系统占用C盘空间过大怎么办_系统盘瘦身与空间清理方法

    使用磁盘清理工具删除系统文件;2. 调整系统还原占用空间;3. 关闭休眠释放hiberfil.sys;4. 迁移用户文件夹至非C盘;5. 移动虚拟内存至其他分区;6. 启用存储感知自动清理,可有效释放并管理C盘空间。 如果您发现Windows 10系统运行一段时间后,C盘可用空间急剧减少,很可能是系…

    2026年10月3日 • 用户投稿
    100
  • 163邮箱如何拦截骚扰邮件_163邮箱骚扰邮件拦截设置

    163邮箱如何拦截骚扰邮件_163邮箱骚扰邮件拦截设置163邮箱如何拦截骚扰邮件_163邮箱骚扰邮件拦截设置163邮箱如何拦截骚扰邮件_163邮箱骚扰邮件拦截设置163邮箱如何拦截骚扰邮件_163邮箱骚扰邮件拦截设置

    可通过启用反垃圾功能、添加黑名单、创建过滤规则和举报恶意邮件减少163邮箱广告干扰。首先开启反垃圾设置并调整强度,再将骚扰发件人加入黑名单或手动管理域名屏蔽;随后在过滤器中设定关键词或主题规则,自动处理可疑邮件;最后通过举报垃圾邮件帮助系统优化识别。 如果您在使用163邮箱时频繁收到无关或广告类邮件…

    2026年10月3日 • 用户投稿
    100
  • 用豆包AI实现Python与数据库交互

    用豆包AI实现Python与数据库交互用豆包AI实现Python与数据库交互用豆包AI实现Python与数据库交互用豆包AI实现Python与数据库交互

    用豆包ai实现python与数据库交互的关键在于借助其生成代码和解决问题的能力。1. 豆包ai虽不能直接操作数据库,但可辅助编写连接数据库的python脚本;2. 使用时先明确数据库类型,向豆包ai请求对应模板,如“帮我写一个python连接mysql的例子”;3. 根据返回的示例代码修改配置参数以…

    2026年10月3日 • 用户投稿
    100
  • es文件浏览器无法删除顽固文件怎么办 es文件浏览器强制删除锁定与顽固文件技巧

    es文件浏览器无法删除顽固文件怎么办 es文件浏览器强制删除锁定与顽固文件技巧es文件浏览器无法删除顽固文件怎么办 es文件浏览器强制删除锁定与顽固文件技巧es文件浏览器无法删除顽固文件怎么办 es文件浏览器强制删除锁定与顽固文件技巧es文件浏览器无法删除顽固文件怎么办 es文件浏览器强制删除锁定与顽固文件技巧

    如果您尝试在ES文件浏览器中删除某些文件,但系统提示无法完成操作,则可能是由于文件被占用、权限不足或文件本身具有只读属性。以下是解决此类问题的步骤: 本文运行环境:小米 14 Pro,Android 14 一、检查并关闭占用文件的应用程序 许多情况下,文件无法删除是因为有后台应用程序正在使用该文件。…

    2026年10月3日 • 用户投稿
    500
  • MySQL 查询中避免重复数据与正确关联:深入理解 JOIN 操作

    本文旨在解决 MySQL 查询中因表关联不当导致的重复数据问题。通过详细解释笛卡尔积的成因,并演示如何利用 INNER JOIN 和 LEFT JOIN 精确关联表,确保查询结果的准确性和完整性,同时介绍现代 SQL JOIN 语法的使用,帮助开发者编写更高效、更可靠的数据库查询。 理解重复数据问题…

    2026年10月3日
    100
  • 如何在装饰器模式中处理内部方法调用:理解与替代方案

    如何在装饰器模式中处理内部方法调用:理解与替代方案如何在装饰器模式中处理内部方法调用:理解与替代方案如何在装饰器模式中处理内部方法调用:理解与替代方案如何在装饰器模式中处理内部方法调用:理解与替代方案

    本文探讨了在使用装饰器模式时,如何处理被装饰对象内部方法相互调用的行为。传统装饰器模式无法直接修改被装饰对象内部的自调用逻辑。我们将深入分析这一限制,并提供一种基于继承的替代方案,通过抽象基类和多态性来有效修改和扩展内部方法行为,帮助开发者选择最适合其场景的设计模式。 1. 装饰器模式与内部方法调用…

    2026年10月3日 • 用户投稿
    000
  • win10硬盘分区变成RAW格式怎么办_RAW分区数据恢复与格式化方法

    win10硬盘分区变成RAW格式怎么办_RAW分区数据恢复与格式化方法win10硬盘分区变成RAW格式怎么办_RAW分区数据恢复与格式化方法win10硬盘分区变成RAW格式怎么办_RAW分区数据恢复与格式化方法win10硬盘分区变成RAW格式怎么办_RAW分区数据恢复与格式化方法

    首先使用数据恢复软件提取RAW分区文件,再通过DiskGenius修复或CHKDSK命令修复文件系统,最后用DiskPart格式化恢复分区正常使用。 如果您尝试访问Windows 10系统中的某个硬盘分区,但系统提示该分区未格式化或文件系统为RAW,则可能是由于文件系统损坏、病毒攻击或异常断电导致。…

    2026年10月3日 • 用户投稿
    100
  • win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复

    win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复

    蓝屏“INACCESSIBLE_BOOT_DEVICE”通常因引导分区无法访问或驱动问题导致,可通过高级启动进入恢复环境,依次尝试启动修复、重建BCD引导配置、禁用快速启动与安全启动,并检查硬盘连接与硬件状态来解决。 如果您在启动Windows 10时看到“你的电脑遇到问题,需要重新启动”的错误提示…

    2026年10月3日 • 用户投稿
    400
  • 微博怎么私信群发_微博私信群发操作方法

    微博怎么私信群发_微博私信群发操作方法微博怎么私信群发_微博私信群发操作方法微博怎么私信群发_微博私信群发操作方法微博怎么私信群发_微博私信群发操作方法

    可通过微博分组功能、第三方工具或企业版接口实现私信群发。①使用微博App创建分组并选择最多20位好友发送私信;②借助WeiboMaster等授权工具批量导入用户ID并设置间隔发送,避免限流;③企业号通过标签体系向5000名互动粉丝定向推送,支持自动回复与状态追踪。 如果您希望在微博上向多位好友批量发…

    2026年10月3日 • 用户投稿
    300
  • 戴尔Inspiron风扇过热怎么办?散热系统维护方法

    戴尔Inspiron风扇过热怎么办?散热系统维护方法戴尔Inspiron风扇过热怎么办?散热系统维护方法戴尔Inspiron风扇过热怎么办?散热系统维护方法戴尔Inspiron风扇过热怎么办?散热系统维护方法

    首先清理通风口和风扇灰尘,确保散热通畅;其次将笔记本置于坚硬平坦表面或使用散热支架改善通风;接着更新驱动程序与BIOS以恢复风扇智能调速功能;若温度仍高,可考虑更换CPU/GPU导热硅脂提升导热效率;最后通过调整电源管理设置为“平衡”模式降低发热量。 如果您的戴尔Inspiron笔记本电脑出现风扇过…

    2026年10月3日 • 用户投稿
    100
  • Yii框架中的数据校验:确保数据正确性

    yii框架是一款性能强大、易于扩展的php框架,其中数据校验是其核心功能之一。在web开发中,数据校验是确保系统数据正确性的关键环节。本文将介绍yii框架中的数据校验特性,包括其特点、用法和实现原理,以及如何在应用程序中使用。 Yii框架中的数据校验特点 Yii框架中的数据校验具有以下特点: 灵活性…

    用户投稿 2026年10月3日
    200

发表回复

登录后才能评论
关注微信