全网整合营销服务商

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

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

c++如何使用future和promise进行异步编程_c++异步任务实现

std::future和std::promise用于异步传递结果,前者获取后者设置的值;通过std::async可简化异步任务,手动使用时需注意唯一设置值、异常处理及线程安全。

在C++中,std::futurestd::promise 是实现异步编程的重要工具,它们定义在 头文件中,用于在线程之间传递值或异常。通过它们可以轻松地将一个任务的结果从执行线程传递给接收线程。

基本概念:future 与 promise 的作用

std::promise 是一个可写入一次的容器,用于设置某个值或异常;而 std::future 是与之关联的只读对象,用于获取这个值。一旦 promise 设置了值(通过 set_value),future 就可以通过 get() 获取该值,且 get() 会阻塞直到值可用。

这种机制非常适合用于异步任务中:一个线程负责计算并设置结果,另一个线程等待并使用结果。

使用 std::async 简化异步任务

最简单的异步方式是使用 std::async,它自动返回一个 future,无需手动管理 promise。

#include 
#include 
#include 

int compute() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return 42;
}

int main() {
    std::future fut = std::async(compute);

    std::cout << "正在等待结果...\n";
    int result = fut.get(); // 阻塞直到完成
    std::cout << "结果: " << result << "\n";

    return 0;
}

这里 std::async 启动了一个异步任务,返回 future 对象。调用 get() 时主线程会等待任务完成。

手动使用 promise 和 future 控制异步流程

当你需要更精细控制何时设置结果时,可以手动创建 promise 并传递其 future。

#include 
#include 
#include 

void background_task(std::promise&& prom) {
    try {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        prom.set_value("任务完成!");
    } catch (...) {
        prom.set_exception(std::current_exception());
    }
}

int main() {
    std::promise prom;
    std::future fut = prom.get_future();

    std::thread t(background_task, std::move(prom));

    std::cout << "等待后台消息...\n";
    std::string msg = fut.get();
    std::cout << "收到: " << msg << "\n";

    t.join();
    return 0;
}

在这个例子中,主线程创建 promise 并获取对应的 future,然后将 promise 移动到子线程中。子线程完成工作后调用 set_value,唤醒等待的主线程。

注意:每个 promise 只能调用一次 set_value 或 set_exception,多次调用会导致程序终止。

共享状态与线程安全

future 和 promise 共享一个“共享状态”,这个状态由系统管理,保证线程安全。但 promise 本身不是线程安全的——不能在多个线程中同时调用 set_value。通常一个 promise 只由一个线程负责写入。

如果需要多个生产者,应使用其他同步机制(如互斥锁)协调对 promise 的访问,或者改用更高级的并发结构如无锁队列配合 async。

基本上就这些。合理使用 future 和 promise 能让异步逻辑清晰、简洁,避免复杂的回调嵌套。对于简单任务优先使用 std::async;复杂场景再手动管理 promise。不复杂但容易忽略的是异常处理和唯一性约束。


# 工具  # ai  # c++  # ios  # stream  # 异步任务  # 无锁  # 同步机制  # 线程  # 主线程  # 并发  # 对象  # promise  # 异步  # 多个  # 的是  # 是一个  # 在这个  # 当你  # 能在  # 能让  # 与之  # 最简单  # 回调 


相关文章: 如何在IIS中配置站点IP、端口及主机头?  如何快速搭建高效可靠的建站解决方案?  如何在Ubuntu系统下快速搭建WordPress个人网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  如何在企业微信快速生成手机电脑官网?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  php json中文编码为null的解决办法  如何用免费手机建站系统零基础打造专业网站?  如何通过免费商城建站系统源码自定义网站主题与功能?  西安大型网站制作公司,西安招聘网站最好的是哪个?  建站之星展会模版如何一键下载生成?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  制作宣传网站的软件,小红书可以宣传网站吗?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  网站设计制作企业有哪些,抖音官网主页怎么设置?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  c++怎么用jemalloc c++替换默认内存分配器【性能】  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何选择高效便捷的WAP商城建站系统?  浅谈Javascript中的Label语句  如何高效完成独享虚拟主机建站?  建站之星代理费用多少?最新价格详情介绍  建站VPS配置与SEO优化指南:关键词排名提升策略  如何在建站之星绑定自定义域名?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  非常酷的网站设计制作软件,酷培ai教育官方网站?  个人网站制作流程图片大全,个人网站如何注销?  装修招标网站设计制作流程,装修招标流程?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  PHP正则匹配日期和时间(时间戳转换)的实例代码  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  建站之星代理商如何保障技术支持与售后服务?  如何选择PHP开源工具快速搭建网站?  建站之星logo尺寸如何设置最合适?  建站主机选哪家性价比最高?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  html制作网站的步骤有哪些,iapp如何添加网页?  如何用虚拟主机快速搭建网站?详细步骤解析  教学网站制作软件,学习*后期制作的网站有哪些?  如何选择靠谱的建站公司加盟品牌?  建站之星免费版是否永久可用?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  公司网站的制作公司,企业网站制作基本流程有哪些? 

您的项目需求

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