http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 10197|回复: 7

[其他] 多线程IO操作下如何降低耗CPU占用率

[复制链接]
发表于 2013-11-5 15:27:57 | 显示全部楼层 |阅读模式
  1. 多线程操作

  2. //开辟30个线程
  3. for(int i=0;i < 30;i++)
  4.         m_hThrds[i] = StartThread(StartUpdate,lpParam);//保存线程句柄,以便结束的时候,关闭句柄
  5.         
  6. //等待30个线程全部执行完毕
  7. WaitForMultipleObjects(30,m_hThrds,TRUE,INFINITE);

  8. //关闭所有线程句柄
  9. for(int i=0;i<30;i++)
  10.         CloseHandle(m_hThrds[i]);
  11.         
  12. //线程函数
  13. DWORD WINAPI StartUpdate(LPVOID pParam)
  14. {
  15.         //while循环,退出的唯一条件是:链表m_List中的值为空
  16.         while(TRUE)
  17.         {
  18.                 //加锁
  19.                 Lock();
  20.                 if(m_List.IsEmpty())
  21.                 {
  22.                         //解锁
  23.                         Unlock();
  24.                         //链表为空,则退出循环
  25.                         break;
  26.                 }else{
  27.                         //从链表m_List中取出一个值,用于处理
  28.                         XXX = m_List.RemoveHead();
  29.                         //解锁
  30.                         Unlock();
  31.                 }
  32.                 //根据从链表m_List中获取到底值,xxx进行某些IO操作
  33.                 ....
  34.                 Sleep(100);
  35.         }
  36. }
复制代码
以上是,多线程操作下的代码结构,运行的时候,CPU占用率达到了80%左右。不知道是否哪里有逻辑错误?希望大神帮忙指出!


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-11-5 15:33:35 | 显示全部楼层
操作的什么,电脑配置是什么,
 楼主| 发表于 2013-11-5 15:37:14 | 显示全部楼层
本帖最后由 marcofly 于 2013-11-5 15:39 编辑

多线程中的操作:从指定的文本文件中随机读取某100行的文本数据。就这样电脑配置:普通配置。
----------------------------------
使用其他人开发的类似软件,CPU使用率只20%不到,
发表于 2013-11-5 15:45:33 | 显示全部楼层
Lock();主查加锁引起的,看看能不能使用别的试试中和一下,这个貌似不用加锁也行吧,不存在冲突的可能吧
 楼主| 发表于 2013-11-5 15:54:27 | 显示全部楼层
站长苏飞 发表于 2013-11-5 15:45
Lock();主查加锁引起的,看看能不能使用别的试试中和一下,这个貌似不用加锁也行吧,不存在冲突的可能吧

m_List是全局变量,不加锁的话,多个线程m_list.RemoveHead() 就会报错吧
发表于 2013-11-5 16:01:07 | 显示全部楼层
不能通过其他方法来实现吗?这种肯定是比较影响性能的
 楼主| 发表于 2013-11-5 16:08:16 | 显示全部楼层
站长苏飞 发表于 2013-11-5 16:01
不能通过其他方法来实现吗?这种肯定是比较影响性能的

我的需求是这样的:有50个固定的文件需要处理,所以我就实现将这50个文件的文件路径保存到一个全局变量m_list中。
然后,开发多线程,从m_list中每次读取出一个文件路径,根据得到的文件路径,进行某些IO操作。
接触多线程的时间不多,不知道还没有更好的实现方法!

只是这种实现方式的话,在开 1 个线程,CPU使用率也是会达到80%的。

其中有IO操作,应该是IO操作比较耗CPU,不知道有没有有效的办法解决!

发表于 2013-11-5 16:11:09 | 显示全部楼层
如果真的是IO那有什么方法,只能换硬盘,呵呵
我建议你每一个线程去读不同的文件,根据你输入的值进行取就行了,就是在线程调用的方法中再加个参数传一下要执行的路径,没必要加锁能个全局变量出来。可以用这种方法试试,不过30个,对于一个普通电脑来说的话,算是不小的开销了。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-15 18:25

© 2014-2021

快速回复 返回顶部 返回列表