当前位置: 首页 > backend >正文

C++异步操作 - future async package_task promise

异步

异步编程是一种程序设计范式,​​允许任务在等待耗时操作(如I/O、网络请求)时暂停执行,转而处理其他任务,待操作完成后自动恢复​​。其核心目标是​​避免阻塞主线程​​,提升程序的并发性和响应速度。

简单来说:就是不阻塞当前主线程,创建子线程,交给子线程操作

但是线程之前的数据通信较为麻烦所以有了以上操作函数和类

1.async

future类的作用是保存异步操作的结果,从而实现线程间的数据交换

deferred是同步,async是异步

aysnc(deferred/async, 函数名,参数);

#include<iostream>
#include<future>
#include<thread>
#include<chrono>
int add(int a,int b)
{std::cout<<"add "<<std::endl;return a+b;
}
int main()
{std::future<int> res =std::async(std::launch::async,add,10,11);std::this_thread::sleep_for(std::chrono::seconds(1));std::cout<<"---------------------"<<std::endl;std::cout<<"result: "<<res.get()<<std::endl;return 0;
}

执行结果:可以看到先执行了函数里的内容,没有因为主线程的sleep导致运行暂停

2.package_task

可以看到package_task相当于是对async进行了任务封装,

对于一个函数可以方便的重复调用

#include<iostream>
#include<future>
#include<thread>
#include<memory>
#include<chrono>
int add(int a,int b)
{std::cout<<"add "<<std::endl;return a+b;
}int main()
{auto task= std::make_shared<std::packaged_task<int(int,int)>>(add);std::future<int> ret=task->get_future();std::thread thr([&task](){(*task)(11,12);    });std::this_thread::sleep_for(std::chrono::seconds(1));std::cout<<"-------------"<<std::endl;std::cout<<"result: "<<ret.get()<<std::endl;;thr.join();return 0;
}

也是进行了一次异步操作

3.promise

对运行结果进行封装,在运行函数中将结果设置到promise中

#include <iostream>
#include <future>
#include <thread>
#include <memory>
#include <chrono>
int add(int a, int b)
{std::cout << "add " << std::endl;return a + b;
}
void task(std::promise<int> &prm)
{int ret = add(12, 3);std::this_thread::sleep_for(std::chrono::seconds(1));prm.set_value(ret);
}
int main()
{std::promise<int> prm;std::future<int> res = prm.get_future();std::thread thr([&prm](){ task(prm); });int ret = res.get();std::cout << "result: " << ret << '\n';thr.join();return 0;
}

运行结果

4.总结

http://www.xdnf.cn/news/1319.html

相关文章:

  • Java学习手册:RESTful API 设计原则
  • AI日报 - 2025年4月23日
  • css3新特性第六章(2D变换)
  • 使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧为JPG图片
  • 创建表结构
  • 树莓派超全系列教程文档--(39)树莓派config.txt旧版选项
  • 线程同步——线程安全
  • jQuery — 总结
  • 逻辑思维与软件开发:从选定方向到风险管理的全流程
  • BeeWorks:低成本的国产化企业内网即时通讯
  • 使用Multipart Form-Data一次请求获取多张图片
  • Linux网络IP协议
  • 【ROS2】ROS2 插件开发流程(基于 pluginlib)
  • 2023蓝帽杯初赛内存取证-4
  • 数据结构-树
  • 美乐迪电玩客户端打包与资源替换实战教程
  • Shader属性讲解+Cg语言讲解
  • pda数据采集器,是如何采集数据的?
  • Docker底层原理浅析 | namespace+cgroups+文件系统
  • windows搭建xwiki17服务器
  • C++——多态、抽象类和接口
  • 鸿道操作系统Type 1虚拟化:破局AI机器人与智能汽车的“安全”与“算力”双刃剑
  • cloudflare配置邮件路由,实现多邮箱接收邮件
  • Web内网渗透知识大全
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day18
  • 随机数算法原理以及模拟实现
  • QtCreator 调试 Linux 内核详细步骤指南
  • 多轮Function Calling的最佳实践
  • 解决找不到字体的问题
  • org.springframework.beans.factory.config.YamlPropertiesFactoryBean 类详解