Qt 中C++ async实现并行处理

2023-05-16

在项目中,难免遇到性能问题,为了提高处理的性能,针对可以并行处理的部分单独提取出来,利用并行编程来提高处理的速度,从而实现高性能。C++11中有一个async()函数,非常方便的实现异步处理。
每次调用async()函数,会自动创建一个线程来进行处理,并返回一个future<> 未来变量,根据future变量,可以获取返回值。

async函数解析

函数原型如下:

/// Launch code for futures
 enum class launch
 {
   async = 1,
   deferred = 2
 };
  
template<typename _Fn, typename... _Args>
    using __async_result_of = typename result_of<
      typename decay<_Fn>::type(typename decay<_Args>::type...)>::type;
      
template<typename _Fn, typename... _Args>
    future<__async_result_of<_Fn, _Args...>>
async(launch __policy, _Fn&& __fn, _Args&&... __args);

1、入参

1.1 launch __policy 异步处理的策略,包括两种: async 和 deferred

async = 1,      // 调用async函数的时候就已经运行程序了
deferred = 2    // 延迟运行,当返回的future调用get函数时开始运行异步处理函数。

1.2 _Fn&& __fn 异步处理的函数
1.3 _Args&&… __args 异步处理函数的输入参数。

简单的函数模型为: async(异步策略, 异步处理函数(lamda表达式比较方便), 异步处理函数的参数)

int func(int a) {
	std::cout<<a;
	return a+1;
}

future<int> fu = async(std::launch::async, func, 1000);

2、返回结果

2.1 返回结果为 future 变量,这里的type跟异步处理函数的返回值类型保持一致,例如:

int funcInt(int a) {
	std::cout<<a;
	return a+1;
}

void funcVoid(int a) {
	std::cout<<a;
	return;
}

future<int>  fu = async(std::launch::async, funcInt,  1000);
future<void> fu = async(std::launch::async, funcVoid, 1000);

当policy 设置为deferred 时,返回的future实例调用get函数,此时异步处理才开始例如:

future<int>  fu  = async(std::launch::deferred, funcInt,  1000);
future<void> fu2 = async(std::launch::async,    funcVoid, 1000);  // 此时funcVoid函数开始运行

int ret = fu2.get();   // 运行到这里,funcInt()函数才开始运行
fu.wait();             // 等待funcVoid函数运行完成

async实现异步处理

实例:当前有一个vector向量,长度为10000,处理器是4核,需要将10000个数据拷贝到一个数组中。

void dataCopy(vector<int> &src, int *dst, int dstLen) {
	int len = src.length();
	int threadNum = 4;
	future<void> futureList[threadNum];        // 定义一个future<void> 数组,用来存放async返回值,这里的void是异步函数的返回类型。
	
	for (int i = 0; i < threadNum; i++) {      // for循环对每个线程启动async处理
		futureList[i] = std::async(std::launch::async, [&](int start, int end) {   // policy是async,代表程序运行到这个地方,就已经开始运行后面的lamda表达式了 
			for (int j = start; j < end; j++) {
				dst.at(j) = src.at(j);
			} 
		}, i * len / threadNum, (i + 1) * len / threadNum);  // 后面这两个是lamda表达式的输入参数。
	}
	
	for (int i = 0; i < threadNum; i++) {
		futureList[i].wait();              // 等待所有线程结束
	}
	
	return;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 中C++ async实现并行处理 的相关文章

  • 大端存储和小端存储

    一 大端存储 高字节数据存储在低地址 二 小端存储 低字节数据存储在低地址 注意 xff1a 无论是大端存储还是小端存储 xff0c 读取到的数据为0x0102030405 三 大端存储或小端存储都是由系统设定的 xff0c 其二者区别在于
  • 多播的概念

    一 多播概述 多播 xff1a 数据的收发仅仅在同一组中进行 xff08 相当于我往一个群里发 xff0c 只有加入这个群的人才能收到 xff09 多播的特点 xff1a 多播地址标示一组接口 多播可以用于广域网使用 在IPv4 xff0c
  • 利用C语言编写一个网络分析器

    一 链路层数据格式 mac报文 xff1a 14个字节 二 IP数据报文格式 三 TCP数据报文格式 四 UDP数据报文格式 五 demo xff08 网络分析器 xff09 recvfrom接收链路层帧数据 xff0c 不经过网络层 传输
  • ARP攻击代码(ARP欺骗)

    一 ARP攻击 ARP欺骗攻击原理 xff1a ARP欺骗攻击建立在局域网主机间相互信任的基础上的 比如 xff1a 假设A B C在同一个局域网中 xff0c 网关为192 168 43 1 xff0c IP地址和MAC地址分别假设如下
  • 使用wireshark抓包并分析TCP三次握手

    一 实验过程 1 TCP包抓取及分析过程 确认使用的协议 xff0c 使用HTTP服务 选择https www baidu com 作为目标地址 启动Wireshark软件 xff0c 点击开始抓包后 在浏览器地址输入https www b
  • 使用wireshark抓包并分析TCP四次挥手

    一 四次挥手 第一次挥手 xff1a xff08 FIN 43 ACK xff09 客户端发送FIN 43 ACK包给服务端 xff0c 用来关闭客户端到服务器的数据传送 此时客户端进入FIN WAIT 1状态 第二次挥手 xff1a AC
  • TR-069协议介绍

    一 概念 关于TR 069 协议命名 TR 069 全称 Technical Report 069 是由DSL Forum xff08 一个非盈利性的全球行业联盟 致力于发展宽带网络范 xff09 其成员包括通讯 设备 计算机 网络和服务提
  • FFMPEG关键结构体——AVCodecContext

    一 AVCodecContext结构体 这是一个描述编码器上下文的数据结构 xff0c 包含了众多编码器需要的参数信息 该结构体在libavcodec avcode h中定义 二 常见变量
  • FFMPEG关键结构体——AVIOContext

    一 AVIOContext结构体 这个结构体 xff0c 是FFmpeg中有关io操作的顶层结构体 xff0c 是avio的核心 FFmpeg支持打开本地文件路径和流媒体协议的URL 该结构体在libavformat avio h中定义 二
  • 指针数组和数组指针

    一 什么是指针数组 一个数组 xff0c 若其元素均为指针类型数据 xff0c 称为指针数组 xff0c 也就是说 xff0c 指针数组中的每一个元素都存放一个地址 xff0c 相当于一个指针变量 span class token keyw
  • Symfony学习笔记之翻译组件-----translation总结

    过际化 xff08 internationalization xff0c 常被简写为i18n xff09 xff0c 是指将字符串和其他一些具有区域特征的片段 xff0c 从你的程序中提取 xff08 abstract xff09 出来 x
  • 为什么要配环境变量?path用来干什么?

    提出问题 xff1a 为什么要配环境变量 xff1f 配环境变量解决了什么 xff1f xff08 阿菜进来看哈嘛 xff09 注 xff1a 环境变量具体概念自行百度百科 概念理解 xff1a 环境变量相关概念 path路径 xff1a
  • Ubuntu18.04无wifi图标安装Realtek RTL8111/8168/8411网卡驱动详解

    这是本人第一次写博客 xff0c Ubuntu系统网卡驱动问题也已经遇到过两次了 xff0c 本次写下博客作为记录 xff0c 希望对遇到同样问题的同学有所帮助 电脑 xff1a 联想E14 系统 xff1a Ubuntu18 04 使用网
  • ROS echo 命令出现报错Cannot load message class for .... Are your messages built?解决办法

    1 把别人录制的bag包拿到自己的系统环境中echo某个topic想查看内容 xff0c 键入echo命令后弹出Are your messages built 错误 xff0c 原因 xff1a 没有在自己的工作空间下的devel incl
  • Pixhawk---基于NSH的Firmware开发与调试

    xfeff xfeff 版权声明 xff1a 本文为博主 原创 文章 xff0c 未经博主允许可以转载 xff0c 注明博客出处 xff1a http blog csdn net FreeApe 目录 43 相关知识了解 1 Nuttx系统
  • Ubuntu18.04安装Terminator后切换回默认终端

    step1 打开一个终端 xff0c 键入以下命令 xff1a sudo update alternatives config x terminal emulator step2 输入你的密码 xff0c 会看到可选项 xff0c 选择 u
  • Ubuntu 安装Cmd Markdown

    Step1 官网下载压缩包 https www zybuluo com cmd Step2 解压缩包 span class token function tar span xvf cmd markdown linux64 tar gz sp
  • Ubuntu20.04 Firefox浏览器设置暗黑主题

    Ubuntu20 04 Firefox浏览器设置暗黑主题 浏览器右上角点击三横线 xff0c 选择扩展 xff0c 搜索Dark Reader 安装并启用即可
  • ROS运行Rviz显示Marker基本形状,修改FixedFrame后无显示问题解决

    终端运行Rviz报错如下图所示 WARN 1667616309 306792325 Invalid argument pub shapes passed to canTransform argument source frame in tf
  • C++类外写构造函数实现编译报错:definition of implicitly-decleared ‘函数名’

    原报错代码 class Building class GoodGay public void visit Building building class Building friend class GoodGay public Buildi

随机推荐