多线程执行CPU过高问题
在项目开发过程中使用到多线程技术,有时程序运行起来占用CPU很高(具体占用多少,跟你的CPU核数有关。若是单核,可能直接100%),应该以release版本的运行的情况为准(因为若是多个子线程间的阻塞没处理好,可能调试过程中查看的CPU占用并不高)。这种问题,一般都是在多线程的处理中,有死循环了。
解决办法:
找到所有的线程处理函数并在入口打上断点,耐心的一步步调试,只要坚信问题的存在,最后总是会找出问题的。
CPU占用高不高,跟你的线程数多少没有太多的影响。因为若你CPU是双核,即使只创建了2个子线程,而这两个子线程是2个死循环,此时你的CPU占用也会是相当的高的。
不信的可以直接试试。
CPU占用高不高也不能只看本程序运行起来的CPU占用率,因为若是你的程序使用了内核对象的调用,那么在任务管理器中你会看到你的程序占用CPU是不高的,但使用到内核对象在内核调用中的那些服务程序就会显示CPU占用高。
- int _tmain(int argc, _TCHAR* argv[])
- {
- InitializeCriticalSection(&m_gCriticalSection);
- //一个线程最多可以挂起 MAXIMUM_SUSPEND_COUNT次,即127次
- //线程1
- unsigned threadID;
- hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc1, NULL, 0, &threadID);
- //线程2
- unsigned threadID2;
- hThread2 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc2, NULL, 0, &threadID2);
- return 0;
- unsigned __stdcall ThreadProc1(void* pParam)
- {
- //打印数字iCount
- if(0 == m_gCount)
- {
- Sleep(2000);
- }
- while(1)
- {
- EnterCriticalSection(&m_gCriticalSection);
- m_gCount++;
- <span style="color:#ff0000;">cout << "线程一:" << m_gCount << endl; //两个线程函数中的的这句不注释掉,该程序在任务管理中显示占用的CPU是不高的,但内核调用占用CPU很高</span>
- <span style="color:#ff0000;"> //若是注释掉,则程序在任务管理器中显示占用的CPU就会很高
- </span> LeaveCriticalSection(&m_gCriticalSection);
- //Sleep(1000);
- }
- return 0;
- }
- unsigned __stdcall ThreadProc2(void* pParam)
- {
- //打印数字iCount
- while(1)
- {
- EnterCriticalSection(&m_gCriticalSection);
- m_gCount++;
- <span style="color:#ff0000;">cout << "另一线程:" << m_gCount << endl;
- </span> LeaveCriticalSection(&m_gCriticalSection);
- //Sleep(1000);
- }
- return 0;
- }
多线程执行CPU过高问题相关推荐
- 推测的删除锁(Speculative Lock Elision):实现高并发多线程执行
背景 SLE全称Speculative Lock Elision,我称之为推测的删除锁.这是一篇关于SLE的论文翻译,但是因为本人英语功底很差,所以翻译的不通顺而且会有很多错误的地方.之所以把它发出来 ...
- CPU核心数与多线程执行效率的关系
昨天面试时被问到"CPU核心数量与多线程执行效率有关系吗",当时脑袋有点蒙,直接就回答了"没关系",今天早上仔细一想,发现自己也不知道到底有没有关系,于是上 ...
- new Random().Next(1, 100); 多线程同时执行结果很高概率相同,
/// <summary>/// new Random().Next(1, 100); 多线程同时执行结果很高概率相同,/// 是用的当前时间为seed,时间相同结果相同/// /// 解 ...
- 执行计划中cpu耗时_面试被问怎么排查遇到的系统CPU飙高和频繁GC,到底该怎么回答?...
处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...
- window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查
这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是 ...
- Java多线程精讲(非高并发-授课专用)附synchronized
Java多线程精讲(非高并发-授课专用) 目录 程序,进程,线程的基本概念 start与run的区别 函数测试demo: 创建线程(一)[new Thread()] 创建线程(二)[extends T ...
- Java程序占用 CPU 过高怎么排查
Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...
- 面试官:生产环境碰到系统CPU飙高和频繁GC,你要怎么排查?
点击上方"小哈学Java",选择"星标" 回复"666",领取100G独家整理的学习资料哟~ 来源:http://t.cn/EI9JdBu ...
- java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查
这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的.线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一 ...
最新文章
- SVN错误:SVN Working copy XXX is too old
- numpy dot()函数(两个数组的点积)(对于二维阵列,它是矩阵乘积)
- 理解新增贷款、M2、社会融资总量之间的关系
- Sum of Log(2020上海C)
- 前端学习(1654):前端系列实战课程之js运行代码
- 华三模拟器hcl实验手册_实验室 | # 实验室废气处理系统的设计#
- python哪个更强大_Ruby和Python哪个更强大?学习分析
- 让读者快速了解RocketMQ消息中间件需要解决哪些问题
- VS2010 打包生成exe文件后 执行安装文件出现 TODO:lt;文件说明gt;已停止工作并已关闭...
- DSP实验二c语言程序,实验1.2:编写一个以C语言为基础的DSP程序
- Sequential Model - 序列模型(RNN循环神经网络)
- postsql 10.4安装失败
- 使用Graphics2D给报警图片画框和提示信息
- html 分享页面到微博qq空间
- 高启(1336-1373)
- 一元二次求解matlab程序,怎么用matlab解一元二次方程
- 计算机编程玫瑰花,c语言实现玫瑰花的方法
- 螺丝组装扭力常用规范
- 如何限制IP访问你的网站?
- 计算机组网的有线传输媒介主要依赖,家庭无线局域网组建毕业论文