全网整合营销服务商

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

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

C++如何使用std::future和std::promise进行线程间通信?(代码示例)

std::future和std::promise是C++11提供的单次值线程间传递机制:promise通过set_value/set_exception写入结果,future通过get/wait_for读取,共享状态自动同步,仅可移动不可拷贝。

std::future 和 std::promise 是 C++11 引入的用于在线程间传递单次值的配套机制:promise 负责“设置”结果,future 负责“获取”结果。它们不共享内存,而是通过一个共享状态(shared state)解耦生产者与消费者,适合一对一线程通信或异步任务结果传递。

基本配对用法:一个线程设值,另一个取值

promise 对象持有可写入的共享状态,调用 set_value() 后,绑定的 future 就能通过 get() 安全读取(若未就绪则阻塞)。注意:每个 promise/future 对只能使用一次,且不能拷贝(仅可移动)。

// 示例:主线程等待子线程计算完成

#include 
#include 
#include 

int main() {
    std::promise prom;
    std::future fut = prom.get_future(); // 获取关联的 future

    std::thread t([&prom]() {
        // 模拟耗时计算
        std::this_thread::sleep_for(std::chrono::seconds(1));
        prom.set_value(42); // 设置结果(只能调用一次)
    });

    std::cout << "等待结果...\n";
    int result = fut.get(); // 阻塞直到 set_value 被调用
    std::cout << "得到结果:" << result << "\n";

    t.join();
    return 0;
}

处理异常:用 set_exception 传递错误

如果异步操作可能失败,promise 支持通过 set_exception 传递异常对象,future 的 get() 会重新抛出该异常,避免错误被静默吞掉。

// 在子线程中捕获异常并转发

std::thread t([&prom]() {
    try {
        throw std::runtime_error("计算失败");
    } catch (...) {
        prom.set_exception(std::current_exception()); // 转发当前异常
    }
});

try {
    int x = fut.get(); // 这里会抛出 runtime_error
} catch (const std::exception& e) {
    std::cout << "捕获异常:" << e.what() << "\n";
}

非阻塞检查:wait_for 与 wait_until

future 提供超时等待能力,避免无限阻塞。wait_for 返回 std::future_status 枚举值,可用于轮询或带超时的同步逻辑。

  • std::future_status::ready:值已就绪(set_value 或 set_exception 已调用)
  • std::future_status::timeout:超时,尚未就绪
  • std::future_status::deferred:仅适用于 std::async(launch::deferred),此处通常不出现
// 等待最多 500ms
if (fut.wait_for(std::chrono::milliseconds(500)) == std::future_status::ready) {
    std::cout << "成功获取:" << fut.get() << "\n";
} else {
    std::cout << "超时,任务未完成\n";
}

与 std::async 配合更简洁(但语义不同)

std::async 会自动创建 promise/future 对,并启动异步任务。它返回的 future 也支持 get()、wait_for 等操作,但底层调度由实现决定(可能延迟执行)。若需精确控制线程生命周期或手动触发,仍应显式使用 promise/future。

// 等效但更简短(内部仍用 promise/future 实现)
auto fut2 = std::async(std::launch::async, []() -> int {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return 123;
});
std::cout << "async 结果:" << fut2.get() << "\n";

基本上就这些。核心是理解 promise 是“写端”,future 是“读端”,共享状态自动管理线程安全——你不用加锁,get() 和 set_value() 内部已同步。注意别重复 set、别跨线程拷贝 promise/future、及时 join 或 detach 线程即可。


# ai  # c++  # ios  # stream  # 异步任务  # red  # 线程  # 线程生命周期  # 主线程  # 对象  # promise  # 异步  # 抛出  # 就能  # 最多  # 适用于  # 你不用  # 绑定  # 未完成  # 加锁  # 但更  # 仍应 


相关文章: 英语简历制作免费网站推荐,如何将简历翻译成英文?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  建站主机如何选?性能与价格怎样平衡?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何在Ubuntu系统下快速搭建WordPress个人网站?  网站网页制作专业公司,怎样制作自己的网页?  建站之星安装提示数据库无法连接如何解决?  如何在Golang中指定模块版本_使用go.mod控制版本号  香港服务器网站推广:SEO优化与外贸独立站搭建策略  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何快速辨别茅台真假?关键步骤解析  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何通过宝塔面板实现本地网站访问?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  如何用景安虚拟主机手机版绑定域名建站?  如何将凡科建站内容保存为本地文件?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  公众号网站制作网页,微信公众号怎么制作?  浅谈Javascript中的Label语句  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何在云主机上快速搭建多站点网站?  如何通过二级域名建站提升品牌影响力?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  西安大型网站制作公司,西安招聘网站最好的是哪个?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何在自有机房高效搭建专业网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  微课制作网站有哪些,微课网怎么进?  如何在西部数码注册域名并快速搭建网站?  建站主机服务器选型指南与性能优化方案解析  建站上市公司网站建设方案与SEO优化服务定制指南  黑客如何利用漏洞与弱口令入侵网站服务器?  高防服务器租用指南:配置选择与快速部署攻略  如何有效防御Web建站篡改攻击?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  网站制作大概多少钱一个,做一个平台网站大概多少钱?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  如何通过商城免费建站系统源码自定义网站主题?  如何配置IIS站点权限与局域网访问?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  如何构建满足综合性能需求的优质建站方案?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  如何解决VPS建站LNMP环境配置常见问题?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面? 

您的项目需求

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