讲师中心 微信公众号
AI工具推荐 视频效率加速

C++多线程怎么实现类似JavaScript的Promise接口

阿枫君_8872

阿枫君_8872

发布时间:2026-08-23 15:11:19

|

852人浏览过

|

来源于php中文网

原创

std::future 和 std::promise 是 C++ 实现 Promise 语义的核心设施,支持跨线程结果传递:promise 为写端(set_value/exception),future 为读端(get/wait),二者通过线程安全共享状态绑定,且均仅可移动不可拷贝。

c++多线程怎么实现类似javascript的promise接口

std::future 和 std::promise 就是 C++ 的 Promise 基础设施

JavaScript 的 Promise 核心语义是:异步任务启动后立即返回一个“占位对象”,后续通过 .then() 注册回调,或用 await 等待结果。C++ 标准库没提供链式 .then(),但 std::promise + std::future 已覆盖最核心能力:分离任务发起与结果消费,支持跨线程传递值或异常。

关键点在于:std::promise 是“写端”,负责设置结果;std::future 是“读端”,负责获取结果(可阻塞、可轮询、可等待)。两者通过共享状态绑定,这个状态默认在线程间安全。

常见错误现象:std::future 被拷贝(编译报错),或 std::promise 未被 set_value/set_exception 就析构(导致 std::future_error: broken promise)。

  • std::promise 只能移动,不能拷贝;std::future 同样只可移动 —— 这是强制你明确所有权转移
  • 若用 std::async 启动任务,它内部自动构造 std::promise 并返回 std::future,省去手动配对
  • 不要在未调用 set_value 或 set_exception 前让 std::promise 离开作用域

如何实现 .then() 链式调用(手动版)

C++20 没原生 .then(),但可以用 std::thread 或 std::async 手动模拟:把前一个 std::future 的结果作为参数,传给下一个异步任务。

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

典型场景:HTTP 请求 → 解析 JSON → 更新 UI。注意:每个 .then() 实际是新启一个异步操作,不是在原线程续执行。

示例逻辑:

auto p1 = std::promise<int>{};
auto f1 = p1.get_future();
std::async(std::launch::async, [&]{
    std::this_thread::sleep_for(100ms);
    p1.set_value(42);
});

// then
auto p2 = std::promise<std::string>{};
auto f2 = p2.get_future();
std::async(std::launch::async, [f1 = std::move(f1), &p2]{
    auto val = f1.get(); // 阻塞直到 f1 就绪
    p2.set_value("got: " + std::to_string(val));
});

性能影响:每次 .then() 都涉及一次线程调度和共享状态切换;如果只是简单计算,用同步调用更轻量。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
  • 必须显式 move std::future 到 lambda 捕获列表,否则编译失败
  • 若前一个 future 抛异常,f1.get() 会 rethrow,需 try/catch 并调用 p2.set_exception(...)
  • 没有内置取消机制,无法像 JS 的 AbortSignal 那样中断链

避免踩坑:shared_future 和 wait_for 的正确用法

一个 std::future 只能被 get() 一次,但多个线程可能都需要读结果 —— 这时得用 std::shared_future。

错误做法:把同一个 std::future 传给多个线程,第二个线程调用 get() 会抛 std::future_error: no state。

正确做法:

  • 从原始 std::future 调用 .share() 得到 std::shared_future
  • 用 wait_for() 替代无条件 get(),防止无限阻塞;返回值是 std::future_status 枚举
  • wait_for(0s) 可用于轮询(类似 JS 的 Promise.race([p, timeout]))

兼容性注意:std::shared_future 在 C++11 就存在,但 wait_until/wait_for 的超时精度依赖系统时钟,Windows 上可能只有 ~15ms 分辨率。

要不要自己封装 Promise 类?

如果你项目里大量需要 .then()、.catch()、Promise.all(),且团队熟悉 JS 语义,可以封装一层 —— 但别试图 1:1 复刻。

容易被忽略的复杂点:

  • JS Promise 的 microtask 队列保证回调按注册顺序、在当前宏任务结束后立即执行;C++ 没等价机制,你得选线程池或事件循环来模拟
  • Promise.all() 要求所有 future 就绪才 resolve,但任一失败就得 reject —— 需要同时监听多个 std::future,而标准库不提供 wait-for-any-with-exception-awareness
  • 内存生命周期管理:回调 lambda 捕获的对象,可能比 promise 本身活得久,容易 dangling reference

多数情况下,直接用 std::promise/std::future + std::async 更清晰;真要高级抽象,优先考虑成熟库如 libunifex 或 cppcoro 的 task/future 实现。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2108

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

959

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

387

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

366

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

560

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1389

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1177

2024.03.22

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 11.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn