在项目开发过程中使用到多线程技术,有时程序运行起来占用CPU很高(具体占用多少,跟你的CPU核数有关。若是单核,可能直接100%),应该以release版本的运行的情况为准(因为若是多个子线程间的阻塞没处理好,可能调试过程中查看的CPU占用并不高)。这种问题,一般都是在多线程的处理中,有死循环了。

解决办法:

找到所有的线程处理函数并在入口打上断点,耐心的一步步调试,只要坚信问题的存在,最后总是会找出问题的。

CPU占用高不高,跟你的线程数多少没有太多的影响。因为若你CPU是双核,即使只创建了2个子线程,而这两个子线程是2个死循环,此时你的CPU占用也会是相当的高的。

不信的可以直接试试。

CPU占用高不高也不能只看本程序运行起来的CPU占用率,因为若是你的程序使用了内核对象的调用,那么在任务管理器中你会看到你的程序占用CPU是不高的,但使用到内核对象在内核调用中的那些服务程序就会显示CPU占用高。

[cpp] view plaincopyprint?
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. InitializeCriticalSection(&m_gCriticalSection);
  4. //一个线程最多可以挂起 MAXIMUM_SUSPEND_COUNT次,即127次
  5. //线程1
  6. unsigned threadID;
  7. hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc1, NULL, 0, &threadID);
  8. //线程2
  9. unsigned threadID2;
  10. hThread2 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc2, NULL, 0, &threadID2);
[cpp] view plaincopyprint?
  1. return 0;
[cpp] view plaincopyprint?
  1. unsigned __stdcall ThreadProc1(void* pParam)
  2. {
  3. //打印数字iCount
  4. if(0 == m_gCount)
  5. {
  6. Sleep(2000);
  7. }
  8. while(1)
  9. {
  10. EnterCriticalSection(&m_gCriticalSection);
  11. m_gCount++;
  12. <span style="color:#ff0000;">cout << "线程一:" << m_gCount << endl; //两个线程函数中的的这句不注释掉,该程序在任务管理中显示占用的CPU是不高的,但内核调用占用CPU很高</span>
[cpp] view plaincopyprint?
  1. <span style="color:#ff0000;">                       //若是注释掉,则程序在任务管理器中显示占用的CPU就会很高
  2. </span>       LeaveCriticalSection(&m_gCriticalSection);
  3. //Sleep(1000);
  4. }
  5. return 0;
  6. }
  7. unsigned __stdcall ThreadProc2(void* pParam)
  8. {
  9. //打印数字iCount
  10. while(1)
  11. {
  12. EnterCriticalSection(&m_gCriticalSection);
  13. m_gCount++;
  14. <span style="color:#ff0000;">cout << "另一线程:" << m_gCount << endl;
  15. </span>       LeaveCriticalSection(&m_gCriticalSection);
  16. //Sleep(1000);
  17. }
  18. return 0;
  19. }

多线程执行CPU过高问题相关推荐

  1. 推测的删除锁(Speculative Lock Elision):实现高并发多线程执行

    背景 SLE全称Speculative Lock Elision,我称之为推测的删除锁.这是一篇关于SLE的论文翻译,但是因为本人英语功底很差,所以翻译的不通顺而且会有很多错误的地方.之所以把它发出来 ...

  2. CPU核心数与多线程执行效率的关系

      昨天面试时被问到"CPU核心数量与多线程执行效率有关系吗",当时脑袋有点蒙,直接就回答了"没关系",今天早上仔细一想,发现自己也不知道到底有没有关系,于是上 ...

  3. new Random().Next(1, 100); 多线程同时执行结果很高概率相同,

    /// <summary>/// new Random().Next(1, 100); 多线程同时执行结果很高概率相同,/// 是用的当前时间为seed,时间相同结果相同/// /// 解 ...

  4. 执行计划中cpu耗时_面试被问怎么排查遇到的系统CPU飙高和频繁GC,到底该怎么回答?...

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  5. window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是 ...

  6. Java多线程精讲(非高并发-授课专用)附synchronized

    Java多线程精讲(非高并发-授课专用) 目录 程序,进程,线程的基本概念 start与run的区别 函数测试demo: 创建线程(一)[new Thread()] 创建线程(二)[extends T ...

  7. Java程序占用 CPU 过高怎么排查

    Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...

  8. 面试官:生产环境碰到系统CPU飙高和频繁GC,你要怎么排查?

    点击上方"小哈学Java",选择"星标" 回复"666",领取100G独家整理的学习资料哟~ 来源:http://t.cn/EI9JdBu ...

  9. java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的.线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一 ...

最新文章

  1. SVN错误:SVN Working copy XXX is too old
  2. numpy dot()函数(两个数组的点积)(对于二维阵列,它是矩阵乘积)
  3. 理解新增贷款、M2、社会融资总量之间的关系
  4. Sum of Log(2020上海C)
  5. 前端学习(1654):前端系列实战课程之js运行代码
  6. 华三模拟器hcl实验手册_实验室 | # 实验室废气处理系统的设计#
  7. python哪个更强大_Ruby和Python哪个更强大?学习分析
  8. 让读者快速了解RocketMQ消息中间件需要解决哪些问题
  9. VS2010 打包生成exe文件后 执行安装文件出现 TODO:lt;文件说明gt;已停止工作并已关闭...
  10. DSP实验二c语言程序,实验1.2:编写一个以C语言为基础的DSP程序
  11. Sequential Model - 序列模型(RNN循环神经网络)
  12. postsql 10.4安装失败
  13. 使用Graphics2D给报警图片画框和提示信息
  14. html 分享页面到微博qq空间
  15. 高启(1336-1373)
  16. 一元二次求解matlab程序,怎么用matlab解一元二次方程
  17. 计算机编程玫瑰花,c语言实现玫瑰花的方法
  18. 螺丝组装扭力常用规范
  19. 如何限制IP访问你的网站?
  20. 计算机组网的有线传输媒介主要依赖,家庭无线局域网组建毕业论文

热门文章

  1. 初始化方法-创建对象时自动调用初始化方法
  2. Scala语言整理(一)
  3. python 函数参数_python之函数(二)——函数参数详解
  4. 解决GitHub中头像显示异常、设置不了头像、README图片无法显示等问题
  5. pytorch教程龙曲良06-10
  6. 朴素贝叶斯法---朴素贝叶斯法的参数估计
  7. MySQL的行锁和表锁
  8. 在MySQL中使用explain查询SQL的执行计划
  9. CSS(五):背景、列表、超链接伪类、鼠标形状控制属性
  10. REST 之 Spring 4 RESTful service