新闻中心

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

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

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

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

基本概念:future 与 promise 的作用

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

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

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

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

#include <iostream>
#include <future>
#include <thread>

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

int main() {
    std::future<int> 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。

php中级教程之ajax技术 php中级教程之ajax技术

AJAX即“Asynchronous J*ascript And XML”(异步J*aScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许J*aScript在浏览器上执行。《php中级教程之ajax技术》带你快速

php中级教程之ajax技术 2114 查看详情 php中级教程之ajax技术
#include <iostream>
#include <future>
#include <thread>

void background_task(std::promise<std::string>&& 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<std::string> prom;
    std::future<std::string> 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。不复杂但容易忽略的是异常处理和唯一性约束。

以上就是c++++如何使用future和promise进行异步编程_c++异步任务实现的详细内容,更多请关注其它相关文章!


# 编解码  # 广东小程序网站建设  # seo外包软件优化  # 重庆seo管理平台官网  # 郑州推广网站搭建成本  # 咸阳营销推广报价  # 网站美团优化团队可靠吗  # 疫情期间创业网站建设  # 红包营销平台推广  # seo文字标签  # 如何做seo优化项目  # 是指  # 在这个  # 是在  # 工具  # 是一个  # 的是  # 有什么区别  # 多个  # 如何实现  # 如何使用  # 同步机制  # 无锁  # 异步任务  # stream  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AO3同人作品网入口 AO3搜索引擎官网永久地址  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  12306选座如何查看座位示意图_12306座位示意图解读与使用  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  J*a应用程序首次运行自动创建文件与目录的最佳实践  如何使 Jest 模拟函数默认抛出错误以提高测试效率  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  Django模型中自动计算可用余额的实现方法  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  晋江读书网页版在线登录 晋江读书电脑版官网  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Node.js中HTML按钮与J*aScript函数交互的正确姿势  AO3最新可访问网址 Archive of Our Own官方在线入口  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  12306选座怎么选到临时改签座_12306改签选座策略与步骤  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  Android Studio计算器C键功能异常排查与修复教程  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  c++ 命名空间怎么用 c++ namespace使用指南  必由学官方登录入口 必由学教师学生账号快速访问  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  Mac怎么锁定备忘录_Mac备忘录加密设置教程  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  Lar*el Form Request中唯一性验证在更新操作中的正确实现  邮政快递单号查询入口 邮政快递物流信息在线查询入口  word中如何让数字纵向排列_Word数字纵向排列方法  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  12306选座怎么选到商务座_12306商务座选择与配置说明  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  夸克AO3官网入口_AO3镜像网站2025推荐  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  必由学官网首页入口 必由学教师网页版登录指南  C++ map遍历方法大全_C++ map迭代器使用总结  解决Tabulator日期时间排序问题的专业指南  支付宝如何设置安全保护_支付宝安全设置的全面教程  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  Go语言中JSON数据解码与字段访问指南  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】 

搜索