如何提高多线程程序的cptgju利用率

C++11 多线程(stdthread)详解 前方高能:本文字数接近2万百度百科中的解释:定义:区别:看了上述介绍,你应该明白进程与线程的区别了。什么,还不明白?下面这幅图应该能让你搞清楚: (自己画的图,不好看请见谅)在C中已经有一个叫做pthread的东西来进行多线程编程,但是并不好用 (如果你认为句柄、回调式编程很实用,那请当我没说),所以c++11标准库中出现了一个叫作std::thread的东西。函数类别作用thread() noexcept默认构造函数创建一个线程, 什么也不做template 阅读详情

正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情。在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行。然后,事情确实你发现创建多线程根本没有让程序快多少,也没有提高多少cpu利用率,甚至可能让cpu利用率下降。唯一能够确定的是多线程能够避免界面假死。为什么会是这样的了。本文将举一些例子和讲述一些原因。


  首先,我来讲一下多处理的一些知识。如下图所示,

  多处理器系统也只有一个待运行的线程队列,内存中也只有一个操作系统拷贝,而且也只有一个内存系统,但是会有多个cpu同时运行不同的线程。一个cpu运行一个线程,那么上图中的系统最多能在同一时间运行2个线程。其实,多处理系统需要掌握的知识不是这些,而是缓存一致性。
  现在来解释下什么是缓存一致性。由于,还是只有一个内存系统。所有cpu都要和这个内存系统通信,但是只有一条总线,那么这无疑会造成总线紧张,限制整体的速度了。那么,你多个cpu也没多少意义了。解决这个问题的办法还是利用cpu的缓存机制,学过组成原理的同学都知道,cpu的缓存命中率还是很高的,有90%以上吧。那么,我继续利用缓存机制还是可以降低总线的频繁使用的。但是,每个cpu都有自己的缓存。如果有2个cpu的缓存存储的是同一内存数据的内容,其中一个cpu的缓存更新了,另外一个cpu的缓存也必须更新,这就是所谓的缓存一致性。编程多线程程序的一个很重要的一点就是避免因为缓存一致性引起的缓存更新风暴。
  现在我举一个缓存更新风暴的例子。
如图所示的类定义,

  锁lockHttp和lockSsl中间只有8个字节,而绝大部分系统上一个缓存行是128个字节,那么这2个锁很可能就处在同一个缓存行上面。那么,最坏的情况会发生什么事情了。假设处理器P1在运行一个处理http请求的线程T1,处理器P2在运行一个处理ssl请求的线程T2,那么当T1获得锁lockHttp的时候,锁的内容就会改变,为了保持缓存一致性,就会更新P2的缓存。那么,T2要获得锁lockssl的时候,发现缓存已经失效了,就必须从内存中重新加载缓存之类。总之,这会将缓存命中率降低到90%以下,引起性能的严重降低。而且发生这种事情的原因是因为我们不了解硬件的体系结构。


  多cpu不能成倍提高速度的原因是任务的某些部分是必须串行处理的。比如,矩阵乘法可以分为三个部分,初始化矩阵,相乘,返回结果。这三部分第二部分可以用多线程来处理,第一部分和第三部分则是不可以的。而且第二部分必须在第一部分完成之后,第三部分必须在第一部分完成之后。那么,无论你添加多少个处理器,最快的时间都至少是第一部分和第二部分的时间之和。这个事实好像叫做Amdahl法则。
  如果使用多线程,那么就必须考虑线程同步,而线程同步又是导致速度降低的关键。所以下面就讲述一些方法来加快多线程程序的吞吐速度。
  方法一,把一个任务分解为多个可以子任务。
  因为总有些子任务是可以并发的,多个子任务并发执行了很可能就能够避免cpu需要io操作的完成了,而且能够提高系统的吞吐量。
  方法二,缓存多线程的共享数据。
  当你已经在使用多线程了,很多时候必须使用共享数据。如果,数据是只读的,那么可以在第一次获取后保存起来,以后就可以重复使用了。但是,第一次的获取还是无法避免的需要线程同步操作的。
  方法三,如果线程数目有限,就不要共享数据。
  做法是为每一个线程实例化一个单独的数据,其实就是为每一个线程分配一块数据使用。这样没有线程同步操作了,速度可以尽可能的提示。
  方法四,如果没办法确定线程数目到底有多少,那么使用部分共享吧。
  部分共享其实就是使用多个资源池代替一个资源池,资源池的数目得更加经验来确定。如下图所示,


  最后在提一个叫做Thundering Herd的问题,该问题维基百科有定义.大意是,当多个线程在等待一个资源的时候,如果事件等待到了,操作系统是唤醒所有等待的线程让它们自己去竞争资源了还是选择一个线程把资源给它。当然唤醒所有的线程肯定开销要大,而且所有没有抢到资源的线程还得重新进入等待状态,这无疑造成很多没必要的操作,浪费了没必要的线程上下文切换。总之,会不会存在Thundering Herd还是跟不同的操作系统有关的。万一存在Thundering Herd了,多线程可能就没那么好办了。


  到现在我们知道了为什么多cpu并不能成倍提高程序的速度了。首先因为有些任务无法并行,其次即使是并行cpu之间还是有很多牵制的。本书的内容主要来自提高c++性能的编程技术一书

 

告别卡顿!易语言乐玩插件多线程绑定多窗口的CPU优化与避坑指南 本文深入解析易语言乐玩插件在多线程绑定多窗口时的CPU优化技巧与避坑指南。通过分析常见性能陷阱、提供参数配置黄金组合及线程安全架构设计,帮助开发者有效降低CPU占用率,实现稳定高效的多窗口自动化操作。特别针对《剑侠情缘》等游戏场景,分享实战优化策略与高级调试方法。 阅读详情

相关推荐

CPU运行线程的随机性,如何提高 CPU 运行线程的效率?什么是 CPU 的利用率和吞吐量?

CPU 利用率:指 CPU 在一定时间内执行指令的时间占总时间的比例,反映了 CPU 的忙碌程度。CPU 利用率越高,表示 CPU 被更充分地利用,但也可能导致 CPU 过载或过热。CPU 利用率越低,表示 CPU 有更多的空闲时间,但也可能导致 CPU 资源浪费或系统性能低下1CPU 吞吐量:指 CPU 在一定时间内完成的任务或指令的数量,反映了 CPU 的处理能力。CPU 吞吐量越高,表示 CPU 能够更快地执行更多的任务或指令,提高了系统的效率和响应速度。

usstmiracle的博客 759

易语言多线程Api封装线程等待CPU优化

API-线程等待CPU优化 用到的API 1、MsgWaitForMultipleObjects 2、WaitForSingleObject 3、SetThreadAffinityMask 4、SetThreadIdealProcessor 511遇见易语言多线程大漠多线程 模块源码 .子程序 线程_等待, 逻辑型, 公开, 等待一个线程,返回真表示线程运行结束,返回假表示已超时 .参数 线程句柄, 整数型 .参数 等待时间, 整数型, 可空, 单位毫秒,默认为5秒,无限等待--4294967

511遇见 7184

易语言CPU亲和性优化

本文还有配套的精品资源,点击获取 简介:易语言是一种面向中文用户的编程语言,本主题探讨如何利用易语言优化CPU亲和性,提升程序性能。CPU亲和性是指多核处理器中核心之间的协同工作方式,通过调整亲和性可避免核心过载和空闲,提高计算效率。易语言通过调用Windows API函数 SetProcessAffinityMask 和 GetProcessAffi...

weixin_42234168的博客 1599

多线程

*多线程 1.理解线程的概念 线程:是CPU中运算和分配的基本单位,也是进程中运算的基本单位,一个进程中可以有多个线程。 进程:一个程序的运行实例,正在进行的程序,通常来说一个程序对应着一个进程,它有独立的内存空间和系统资源。 多线程和单线程 单线程:如果一个程序中只有一个线程,则称为单线程。 多线程和单线程的区别: 1.多线程在执行时并不一定有单线程执行快。 2.多线程产生的根本原因也是它的最...

Javastudenthhhk的博客 888

易语言CPU优化

易语言CPU优化,改下进程名字即可。。一起学习,一起进步。

新英格兰10机39节点matlab建模,ieee10机39节点系统数据

【实例简介】ieee10机39节点系统数据,主要是BPA数据!【实例截图】【核心代码】ne_039_bus└── ne_039_bus├── 039readme.doc├── bpa│ ├── 039bpa.dat│ ├── 039bpa.swi│ ├── LFerr.LIS│ ├── OneNote 目录.onetoc2│ └── STERR.LIS├── eurostag│...

weixin_39851809的博客 3272

Windows 常用命令-开启多核处理器

如何进入命令行窗口 方法一:Win+S 打开windows搜索框,输入cmd即可,即打开命令提示符 方法二:Win+R,输入“cmd”即可 文章目录常用命令查看Windows电脑CPU核心数,线程数开启多核处理器多核CPU,提高资源利用 常用命令 ################################################################### ipconfig /displaydns # 显示dns缓存 ipconfig /flushdns # 刷新D.

Grocery 1万+

DSSAT模型建模教程

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。现有版本V4.7能模拟27种主要农作物的生长发育和产量形成过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。如果你是个模型入门者,这次将让你体验一键模拟的乐趣。

weixin_55561616的博客 1413

CPU,进程, 线程的占用关系

并发和并行的概念区分: 并发,指的是多个事情,在同一时间段内同时发生了。 并行,指的是多个事情,在同一时间点上同时发生了。 并发的多个任务之间是互相抢占资源的。 并行的多个任务之间是不互相抢占资源的、 只有在多CPU或者一个CPU多核的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。 ...

weixin_46217160的博客 7651

AI漫剧制作全流程零基础实操指南:从剧本到剪辑

AI漫剧是一种利用AI工具将剧本、分镜、出图、配音、剪辑整合为流水线的短视频内容形式。其技术原理基于文生图、图生图与文本转语音模型的组合,核心挑战在于角色一致性控制与分镜批量出图。这项技术大幅降低了视频制作门槛,使个人创作者无需演员和设备即可产出剧情向短内容,广泛应用于短视频平台的情景剧、玄幻、甜宠等题材。本文给出了一套零基础可照做的全流程实操方案,覆盖剧本提示词、分镜表、出图选型、配音合成与剪辑模板,帮助你快速跑通AI漫剧制作链路。

weixin_29048309的博客 520

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1939

为什么你的程序跑不满CPU?——简单聊聊多核多线程

最近同事测试自己的程序,感觉处理耗时太长,一看CPU使用率,才25%。想要提高CPU使用率降低处理时长,于是向我询问。以此为契机写了这篇,聊聊多核多线程。

飞临云的博客 2万+

VHDL六层电梯控制器及仿真

六层电梯电梯 设计要求:设计一个六层电梯控制系统要求有超载、关门中断、提前关门清除报警信电梯外人的上升请求信号,电梯外人的下降请求信号, 电梯外人上升请求信号显示电梯外人下降请求信号显示到达楼层信号 设计思路:输入有clk时钟信号(频率为2Hz) full,deng,quick,clr超载、关门中断、提前关门清除报警c_u1,c_u2,c_u3,c_u4,c_u5电梯外人的上升请求c_d2,c_d3,c_d4,c_d5,c_d6 电梯外人的下降请求 d1,d2,d3,d4,d5,d6电梯内人的...

QQ_778132974的博客 1706

CPU性能全开怎么设置?Win11

很多游戏玩家在升级Win11系统之前,最担心的就是游戏性能会不会下降,直接影响游戏体验感?其实只要做好性能优化,同样也可以提高游戏体验。3、隐藏附加计划下,选择高性能(有利于提高性能,但会增加功耗)。2、在Windows设置中,单击游戏,然后再点击游戏模式。3、切换到游戏模式后,再将游戏模式旁边的按钮打开。2、点击编辑电源设置,并选择顶部的电源选项。1、点击Windows按钮,并选择设置。1、在搜索栏中,输入电源计划。

xitongzhijianet的博客 5305

【WorkBuddy专栏58】腾讯为什么要「自己打自己」——7款AI智能体产品全景对比与「赛马」逻辑深度拆解

【WorkBuddy专栏57】你的左侧空间不是「日任务清单」——工作空间才是 WB 变聪明的核心秘密

AI人人懂 670

【FreeSwitch开发实践】外呼网关配置(拨打电话)

FreeSwitch开发一个重要应用是外呼,所谓外呼就拨打真实电话或手机号呼叫,配合语音机器人可以实现智能客服的功能。外呼配置主要是配置外呼服务器,外呼服务器主要指SIP网关,每个外呼服务器就是一个SIP节点,FreeSwitch服务也可以是一个SIP节点。本文主要介绍了FreeSwitch外呼相关配置,主要有外呼配置的模式,包括注册模式和非注册模式网关加载的查看方法拨号中常见的呼出配置和呼入配置如果觉得有些帮助或觉得文章还不错,请关注一下博主,你的关注是我持续写作的动力。............

xiao2macf的专栏 1万+

【debug】查看程序运行过程中各线程 cpu使用率和内存使用情况

程序运行时 cpu使用率和内存使用情况 是算法和代码质量的 重要评估指标。

qq_45110581的博客 3870

【PyGIS】ERA5降雨蒸散发数据预处理

ERA5-LAND降雨蒸散发数据预处理

```On Earth, Be Water, By Coding``` 3144

常见多核CUP利用率与相应线程数量的估算方式

为了提高计算机的执行效率,需要尽量提高CPU的有效执行率。由于主流的应用系统以线程为运算执行基本单位,所以线程数可以等同于运算执行单位数量。由于在用户空间,需要用户自行进行线程的调度,那么如何计算最佳的线程数量呢?本文给出了一些指导原则.........

snefsnef的博客 7744

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

线程池配置与CPU利用率

线程数设置需结合实际场景和目标,通过测试找到最合适的配置。考虑主机和JVM进程中的其他线程对CPU资源的影响。通过不断测试和调整,达到预期的CPU利用率和系统性能。

modelsetget的博客 792

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

如何提高多线程程序的cpu利用率

正如大家所知道的那样,多核多cpu越来越普遍了,而且编写多线程程序也是件很简单的事情。在Windows下面,调用CreateThread函数一次就能够以你想要的函数地址新建一个子线程运行。然后,事情确实你发现创建多线程根本没有让程序快多少,也没有提高多少cpu利用率,甚至可能让cpu利用率下降。唯一能够确定的是多线程能够避免界面假死。为什么会是这样的了。本文将举一些例子和讲述一些原因。首先,...

SurpassLi的专栏 116

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

提高软件CPU占用率

应用程序的CPU优先级配置

C++初学者 7477

线程CPU使用率到底该如何计算?

来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID :emOsprey这篇笔记有如下内容:1、为什么需要计算各个线程的CPU使用率?2、该如何计算线程CPU使用率?3、FreeR...

EmbeddedOsprey 3653

关于多线程在多核cpu上执行效率的问题

前言:博主最近在比较python和go语言写的web服务器的执行效率问题,在看了google搜索结果后,产生了疑问 1.为什么python的异步执行框架tornado效率可以和go语言媲美? 2.为什么随着线程的增加,并发数的增长呈现逐步缓慢的趋势? 带着这些问题,博主探究了下原因,如果有错误,欢迎大家指出。 注意:为简化推理过程和理解,以下只考虑执行任务的线程,系统中其他所有(包括...

THMAIL的博客 6827

Node.js 多进程处理CPU密集任务

Node.js 单线程与多进程 大家都知道 Node.js 性能很高,是以异步事件驱动、非阻塞 I/O 而被广泛使用。但缺点也很明显,由于 Node.js 是单线程程序,如果长时间运算,会导致 CPU 不能及时释放,所以并不适合 CPU 密集型应用。 当然,也不是没有办法解决这个问题。虽然 Node.js 不支持多线程,但是可创建多子进程来执行任务。 Node.js 提供了 child_proce...

weixin_34204722的博客 524
上一篇: research in hard disk IO
下一篇: set thread affioph0iinity cpu
Kelvin-Liang
博客等级 码龄18年 9粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值