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

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.总结

相关文章:

  • Vue项目依赖注入的使用
  • 深度学习模型搭建的基础原理详细介绍
  • C++学习笔记(三十六)——STL之排序算法
  • Java中内部类
  • 电脑硬盘丢失怎么找回?解决硬盘数据恢复的2种方法
  • win10中打开python的交互模式
  • c++STL——stack、queue、priority_queue的模拟实现
  • 【Linux】46.网络基础(3.3)
  • linux下使用wireshark捕捉snmp报文
  • GAEA的技术优势:分层加密与去中心化数据治理
  • 若依SpringCloud项目-定制微服务模块
  • macOS安全隐私最佳实践分析
  • Mujoco xml < sensor>
  • SEO长尾关键词优化核心策略
  • 【Vue】状态管理(Vuex、Pinia)
  • 深度学习训练中的显存溢出问题分析与优化:以UNet图像去噪为例
  • yaml里的挪威问题是啥
  • day3 打卡训练营
  • 编程思想之分片
  • JavaScript 笔记 --- part 5 --- Web API (part 3)
  • “五一”假期首日国铁郑州局迎大客流,预计发送旅客逾95万人次
  • 外交部:中美双方并未就关税问题进行磋商或谈判
  • 新希望一季度归母净利润4.45亿,上年同期为-19.34亿
  • 牛市早报|今年第二批810亿元超长期特别国债资金下达,支持消费品以旧换新
  • 中国人寿一季度净利润288亿增39.5%,营收降8.9%
  • 建行一季度净利833.51亿同比下降3.99%,营收降5.4%