dll中多线程cpu使用率过低

lxgwd 2008-10-13 02:58:57
请教个问题,我写了一个多线程的图像配准程序,使用的双核处理器我用的是多线程的编程, 运行时 cpu可以达到100%,现在我把这个程序以dll文件嵌入大一个大程序中,但是程序运行到这里时 cpu的使用率 不足 30%,请问是为什么, 在我的多线程程序中,因为程序需要我不断的开线程和关线程,是不是我这种操作引起的。。。第一次发帖,希望知道的高手能帮帮忙.
...全文
546 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxgwd 2008-10-17
  • 打赏
  • 举报
回复
恩 给各位分吧
野男孩 2008-10-15
  • 打赏
  • 举报
回复
说得不太清楚。建议可能的话贴代码出来看看~
cppwin 2008-10-15
  • 打赏
  • 举报
回复
先想办法定位具体语句吧,
每次注释掉一半的语句,然后检测,二分法,
直到找到关键语句,问题就比较容易解决了.
lxgwd 2008-10-15
  • 打赏
  • 举报
回复
回楼上的: 是啊 因为计算量较大,所以才用双线程的 在exe中的我的程序几乎就是100%
然后,今天做个一个试验,就是在线程里写了一个while(1)的循环,发现cpu的使用率就上去了100%
而且我还用了一个纯数学计算的循环,计算量较大,我发现cpu使用率是一个锯齿状 100%-30%,所以所以我就怀疑是因为我在线程中计算量较小,计算时间大概为150ms每次 ,但是我每次都需要要申请一次线程来计算,所以这样拖慢了。
但是有点也不明白了 为什么exe中 和dll同样的程序, 结果却不同

看文章看到一个这样的说法: 不知道大家知道不。。
那么如何提高程序的性能?如果是和msvcrt.dll动态链接的,保证这个dll是1999年2月以后,并且安装的service pack的版本是5或更高。如果是静态链接的,保证链接程序的版本号是6或更高,可以用quickview.exe程序检查这个版本号。要改变所要运行的程序的堆函数的选取,在命令行下键入以下命令:

set __MSVCRT_HEAP_SELECT=__GLOBAL_HEAP_SELECTED,1




WinEggDrop 2008-10-15
  • 打赏
  • 举报
回复
过低?难道楼主想CPU使用率达到100%?
lxgwd 2008-10-14
  • 打赏
  • 举报
回复
谢谢大家帮忙了 下午准备在仿真查查问题。 如果做出来就把答案贴上,做不出来就准备结贴了
dch4890164 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 scq2099yt 的回复:]
代码在exe中和在dll中是没有差别的,有可能exe程序做了一些特殊的控制,例如设置进程只能在一个处理器上运行。
[/Quote]
头次听说这个问题,不知道什么原因,感觉这个说法是最有可能的
scq2099yt 2008-10-14
  • 打赏
  • 举报
回复
代码在exe中和在dll中是没有差别的,有可能exe程序做了一些特殊的控制,例如设置进程只能在一个处理器上运行。
lxgwd 2008-10-14
  • 打赏
  • 举报
回复
好 谢谢大家 在等一天就结贴了 到时 散分 谢谢了
阿呆_ 2008-10-14
  • 打赏
  • 举报
回复
还有一个可能,你的dllmain是怎么处理DLL_THREAD_ATTACH/DLL_THREAD_DETACH的? 你每个创建/删除的线程都会调用dllmain的
deryker 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lxgwd 的回复:]
回楼上的 是 在exe里面我可以运行到 100% 但是dll 只有不到30% 2线程的时候 而且dll中虽然运行时间长但是也可以得到正确的结果和exe的结果一样 太颓了 最后了出现这样的问题,本来都准备交项目了
[/Quote]

这个问题影响很大吗?程序对线程的执行效率这么高啊。没有接触过,向你学习。
cnzdgs 2008-10-14
  • 打赏
  • 举报
回复
你在EXE和DLL中执行的代码都是相同的吧?
你可以这样试一下,自己另做一个EXE程序来加载这个DLL,如果可以达到100%就说明问题出在EXE程序上。
lxgwd 2008-10-14
  • 打赏
  • 举报
回复
回楼上的 是 在exe里面我可以运行到 100% 但是dll 只有不到30% 2线程的时候 而且dll中虽然运行时间长但是也可以得到正确的结果和exe的结果一样 太颓了 最后了出现这样的问题,本来都准备交项目了
cnzdgs 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lxgwd 的回复:]
唉 刚才查出来了问题的所在,我用的两个线程,在线程的计算中 dll 和exe所花 的时间没有区别
但是 在WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);后 ,dll的运算时间增加了 800毫秒左右,而且无论是申请单线程和双线程的情况均如此。。CpuNumbers=1或CpuNumbers=2.
[/Quote]
不是很清楚你的意思,你在DLL和EXE中不都是执行WaitForMultipleObjects等待吗?
如果是双核分别运行你的线程,在只剩最后一个线程的时候,另一个处理器就空闲了,所以CPU不会一直100%。
phisherr 2008-10-14
  • 打赏
  • 举报
回复
极端怀疑是物理内存过小造成的
lxgwd 2008-10-14
  • 打赏
  • 举报
回复
唉 刚才查出来了问题的所在,我用的两个线程,在线程的计算中 dll 和exe所花 的时间没有区别
但是 在WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);后 ,dll的运算时间增加了 800毫秒左右,而且无论是申请单线程和双线程的情况均如此。。CpuNumbers=1或CpuNumbers=2.
jameshooo 2008-10-13
  • 打赏
  • 举报
回复
exe使用的是单核模式,没有针对多核进行特别优化 --- 仅仅是猜测
yjgx007 2008-10-13
  • 打赏
  • 举报
回复
你是不是在主进程中创建线程,然后用WaitForMultipleObjects?
这会阻塞主进程的消息处理
用MsgWaitForMultipleObjects
cppwin 2008-10-13
  • 打赏
  • 举报
回复
怀疑问题可能是出在消息处理上,
你的dll是否与主程序频繁通过sendmessage通信?
zhoujianhei 2008-10-13
  • 打赏
  • 举报
回复
当内存不足,系统动用虚拟内存的时候,CPU利用率会降低至10%以下。

加载更多回复(6)

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧