别再滥用std::async了,strace命令暴露了一个乱开线程问题

用strace查看进程的系统调用后,发现一个std::async滥用问题

问题现象

进程的系统调用clone次数持续增加

使用工具strace发现进程clone系统调用过多且一直在增加

strace -c -p PID

问题分析

clone在做什么:创建进程(线程)

查看系统调用,clone在创建进程或者线程的时候会被调用

问题确认

找到问题代码 查看源码,找到问题根源。进程会在一个循环中反复调用 std::async

而std::async会创建线程,因此会有clone系统调用

而这个循环是10Hz,也就是一秒钟执行20次,那么长时间运行之后就会有大量的线程被创建和销毁

问题原因

为什么会这么设计

每次循环中的任务执行时间比较长,为了加速,将任务分为A和B两部分

A部分在循环体中进行,B部分在异步线程执行

即std::async异步完成B,循环中的代码完成A

解决办法

引入线程池,避免线程反复创建和销毁带来的开销

将B部分放到线程池中运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【吊打面试官系列-Mysql面试题】什么是存储过程?用什么来调用?

大家好,我是锋哥。今天分享关于 【什么是存储过程?用什么来调用?】面试题,希望对大家有帮助; 什么是存储过程?用什么来调用? 答:存储过程是一个预编译的 SQL 语句,优点是…

昇思25天学习打卡营第4天|数据变换(Transforms)

一、简介: 数据变换是指将已有的数据转换成可以提供给模型直接训练和验证的数据格式,在深度学习中一般被称为数据预处理,之前在昇思25天学习打卡营第3天|数据集Dataset-CSDN博客 介绍数据集的时候已经有了一个简单的使用,下面将具…

docker 基本用法及跨平台使用

一、Docker的优点 docker 主要解决的问题就是程序开发过程中编译和部署中遇到的环境配置的问题。 1.1 Docker与其他虚拟机层次结构的区别** 运行程序重点关注点在于环境。 VM虚拟机是基于Hypervisor虚拟化服务运行的。 Docker是基于内核的虚拟化技术实现的。 1.2 Docker的技…

基于uniapp的h5接入企业微信客服在线聊天

首先说下企业微信接入场景,支持的接入场景有以下几种,基本上涵盖了微信生态大部分场景: 接入步骤 1.创建企业微信号 按照官方操作步骤注册,需要注意的是未认证仅支持接入100人,已认证支持接入2000人. 2.创建客服账号 每个客服账号支持配置人工或是机器人或是人工机器人回复…

分享uniapp + Springboot3+vue3小程序项目实战

分享uniapp Springboot3vue3小程序项目实战 经过10天敲代码,终于从零到项目测试完成,一个前后端分离的小程序实战项目学习完毕 时间从6月12日 到6月22日,具有程序开发基础,第一次写uniapp,Springboot以前用过,VUE3也…

C++ (week8):数据库

文章目录 一、数据库简介1.数据库2.MySQL(1)数据库的结构(2)MySQL的三种使用方式(3)命令行(4)Navicat Premium 二、SQL1.SQL (Structured Query Language),即结构化查询语言2.数据定义语言 DDL (Data Definition Language) ,创建、修改、删除数据库、表结…

dex文件结构(二):dex文件加载基本原理

return mClassLoader; } 1.3 ApplicationLoaders.getClassLoader public ClassLoader getClassLoader(String zip, String libPath, ClassLoader parent){ //Class.getSystemClassLoader返回的是一个PathClassLoader //baseParent是BootClassLoader ClassLoader basePare…

刷代码随想录有感(113):动态规划——爬楼梯plus

题干&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std;int main(){int n,m;cin>>n>>m;vector<int>dp(n 1, 0);dp[0] 1;for(int j 0; j < n; j){for(int i 1; i < m; i){if(j > i)dp[j] dp[j - i];}}cout<&…

2001NOIP普及组真题 1. 数的计数

线上OJ&#xff1a; 【01NOIP普及组】数的计数 核心思想&#xff1a; 1、样例中给到了 f[6] 6。其实这里包含了 f[3]2&#xff0c; f[2]2, f[1]1, 以及6本身。 注解&#xff1a;按照题意&#xff0c;6前面的数字只能是3,2,1&#xff0c;或者不放&#xff08;不放就是6本身&am…

Python爬虫实战:批量下载网站图片

1.获取图片的url链接 首先&#xff0c;打开百度图片首页&#xff0c;注意下图url中的index 接着&#xff0c;把页面切换成传统翻页版&#xff08;flip&#xff09;&#xff0c;因为这样有利于我们爬取图片&#xff01; 对比了几个url发现&#xff0c;pn参数是请求到的数量。…

Admin

目录 1、 Admin 2、 Contact 3、 Registration 4、 Course Admin

6.22面试问题【1】长链表排序选择归并还是快排

先问快排和归并的思路&#xff1f; 快速排序 快速排序的基本思想是通过一个划分操作&#xff0c;将待排序的数组分为两个部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据要小&#xff0c;然后再递归地对这两部分数据分别进行快速排序&#xff0c;整个排序过程可以…

cocos 如何使用九宫格图片,以及在微信小程序上失效。

1.在图片下方&#xff0c;点击edit。 2.拖动线条&#xff0c;使四角不被拉伸。 3.使用。 其他 在微信小程序上失效&#xff0c;需要将packable合图功能取消掉。

IOS Swift 从入门到精通: 类和继承

文章目录 创建自己的类类继承覆盖方法final 类复制对象反初始化器可变性总结 创建自己的类 类与结构类似&#xff0c;因为它们允许您创建具有属性和方法的新类型&#xff0c;但它们有五个重要的区别&#xff0c;我将逐一介绍每个区别。 类和结构体之间的第一个区别是&#xf…

速度测试分析软件MySpeed

什么是 MySpeed &#xff1f; MySpeed 是一款速度测试分析软件&#xff0c;可记录您长达 30 天的互联网速度。使用 MySpeed&#xff0c;您可以轻松生成有关速度、ping 等的清晰统计数据。配置运行状况检查&#xff0c;以便在出现错误或停机时通过 Gotify、Discord、WhatsApp 或…

海报设计师的福音来了,微软联合清华北大提出Glyph-ByT5-v2,可支持多国语言图文海报生成,效果惊艳!

清华&北大&微软&利物浦大学联合提出Glyph-ByT5-v2这款工具支持多语言图文生成&#xff0c;包括英语、中文、日文、韩文、法文、德文、西班牙文、意大利文、葡萄牙文和俄文。 以下分别展示中、英、日、韩图文的视觉文本结果一起带大家感受一下。 相关链接 论文地址…

Linux源码阅读笔记03-调度器及CFS调度器

调度器 调度器&#xff1a;Linux内核中用来安排调度进程&#xff08;一段程序的执行过程&#xff09;执行的模块成为调度器&#xff0c;他可以切换进程状态。比如&#xff1a;执行、可中断睡眠、不可中断睡眠、退出、暂停等&#xff1b; 调度器的主要职责&#xff1a;选择某些…

gbase8s关于客户端和数据库连接的方式和应用建立连接的简单线索分工

应用和数据库的连接分为本地连接和远程连接&#xff0c;当应用程序和数据库在同一台服务器上为本地连接&#xff0c;不在一台服务器上为远程连接 1. 本地连接 本地连接三种方式&#xff1a; 通过共享内存消息系统&#xff1a;应用和数据库在同一台服务器上&#xff0c;应用程…

判别式模型 vs 生成式模型

判别式模型 vs 生成式模型 在机器学习中&#xff0c;判别式模型和生成式模型是两种重要的模型类型。让我们用简单的语言来理解它们的原理、特点和应用场景。 判别式模型&#xff08;Discriminative Model&#xff09; 什么是判别式模型&#xff1f; 判别式模型专注于区分类别…

C语言 | Leetcode C语言题解之第165题比较版本号

题目&#xff1a; 题解&#xff1a; int compareVersion(char * version1, char * version2){int len1 strlen(version1);int len2 strlen(version2);int i 0;int j 0;while (i < len1 || j < len2) {int num1 0;int num2 0;while (i < len1 && versio…