全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++ std::future和std::promise c++线程间通信【教程】

std::future 和 std::promise 是 C++11 提供的线程安全异步值传递机制,用于单次结果传递;promise 设置值或异常(仅一次),future 通过 get() 获取(仅一次),二者通过共享状态关联,支持移动但不可拷贝。

std::future 和 std::promise 是 C++11 引入的一对配套工具,用于在线程间安全地传递单次结果值,适合“一个线程生产、另一个线程消费”的场景。它们不共享内存,也不需要手动加锁,本质是基于同步通道的异步值传递机制。

std::promise 负责设置结果值

每个 std::promise 对象关联一个共享状态(shared state),它只能被调用一次 set_value()set_exception()set_exception_at_thread_exit()。多次调用会抛出 std::future_error 异常。

  • promise 必须在设置值前,把对应的 future 交给消费者线程(通常通过 move 语义转移)
  • promise 对象本身可被移动,但不可拷贝;它的 shared state 是线程安全的
  • 如果 promise 被销毁而未设置值,其 shared state 会以 std::future_error 异常结束

std::future 负责获取结果值

future 是 promise 的“读取端”,通过 get() 阻塞等待并取出值(或异常)。get() 只能调用一次,之后 future 失效(变为无效状态)。

  • 调用 get() 会阻塞当前线程,直到 promise 设置了值或异常
  • future 支持 wait()、wait_for()、wait_until() 等非阻塞等待方式,用于轮询或超时控制
  • future 也可由 std::async、std::packaged_task 自动创建,不一定非要配对使用 promise

典型协作流程示例

以下是一个跨线程传递 int 值的最小可行代码:

#include 
#include 
#include 

int main() {
    std::promise p;
    std::future f = p.get_future(); // 获取关联 future

    std::thread t([&p]() {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        p.set_value(42); // 生产者设值
    });

    std::cout << "等待中..." << std::endl;
    int result = f.get(); // 消费者取值(阻塞)
    std::cout << "得到:" << result << std::endl;

    t.join();
}

注意:lambda 捕获 promise 时需用引用(&p),否则 set_value 作用于副本,主线程将永远阻塞。

常见陷阱与建议

  • 避免复制 future 或 promise —— 它们都只支持移动语义
  • 不要在 promise 析构前忘记 set_value;可用 std::optional + RAII 封装规避
  • 若需多次通信,不要强行复用 future/promise;改用 std::queue + mutex 或 std::condition_variable
  • 异常传播很自然:promise.set_exception(std::make_exception_ptr(...)),future.get() 会重新抛出


# 工具  # ai  # c++  # ios  # stream  # red  # 封装  # int  # Lambda  # 线程  # 主线程  # 值传递  # 对象  # promise  # 异步  # 抛出  # 是一个  # 也不  # 非要  # 会以  # 都只  # 可由  # 时需  # 作用于  # 加锁 


相关文章: 制作充值网站的软件,做人力招聘为什么要自己交端口钱?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  济南专业网站制作公司,济南信息工程学校怎么样?  建站之星如何一键生成手机站?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何设计高效校园网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何获取开源自助建站系统免费下载链接?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  网站制作报价单模板图片,小松挖机官方网站报价?  营销式网站制作方案,销售哪个网站招聘效果最好?  如何快速搭建自助建站会员专属系统?  如何选择靠谱的建站公司加盟品牌?  如何通过FTP服务器快速搭建网站?  如何用y主机助手快速搭建网站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  ,在苏州找工作,上哪个网站比较好?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何在Windows 2008云服务器安全搭建网站?  宝塔面板如何快速创建新站点?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  建站之星上传入口如何快速找到?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何通过西部数码建站助手快速创建专业网站?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  香港服务器WordPress建站指南:SEO优化与高效部署策略  ,如何利用word制作宣传手册?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  html制作网站的步骤有哪些,iapp如何添加网页?  网站制作员失业,怎样查看自己网站的注册者?  专业公司网站制作公司,用什么语言做企业网站比较好?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  已有域名如何免费搭建网站?  如何通过商城免费建站系统源码自定义网站主题?  如何基于PHP生成高效IDC网络公司建站源码?  油猴 教程,油猴搜脚本为什么会网页无法显示?  Swift中switch语句区间和元组模式匹配  黑客入侵网站服务器的常见手法有哪些?  网站设计制作企业有哪些,抖音官网主页怎么设置?  微课制作网站有哪些,微课网怎么进?  宿州网站制作公司兴策,安徽省低保查询网站?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  建站主机空间推荐 高性价比配置与快速部署方案解析  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。