dll中多线程cpu使用率过低 请教个问题,我写了一个多线程的图像配准程序,使用的双核处理器我用的是多线程的编程, 运行时 cpu可以达到100%,现在我把这个程序以dll文件嵌入大一个大程序中,但是程序运行到这里时 cpu的使用率 不足 30%,请问是为什么, 在我的多线程程序中,因为程序需要我不断的开线程和关线程,是不是我这种操作引起的第一次发帖,希望知道的高手能帮帮忙. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果线程中执行了别人的代码,在别人的代码中只要执行了Sleep或等待函数,CPU使用率就不会是100%了。 楼上的好, 我的程序在进入配准后,全部是我自己的程序,没有用别人的 初步怀疑是我在程序中开关线程很频繁的原因,我程序中 多线程的等待都是 WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);而且在单独以exe运行时,基本可以保证总是 100%左右,这样速度很快,现在总是 30%左右,速度太慢了 代码在exe中和在dll中是没有差别的,有可能exe程序做了一些特殊的控制,例如设置进程只能在一个处理器上运行。 刚才 trace一下 发现 当作dll调用时, DWORD d1 = GetTickCount(); HANDLE *h=new HANDLE[CpuNumbers];//修改了 for(i=0;i<CpuNumbers;i++) { h[i]=::CreateThread(NULL,0,ThreadImage_MI,(LPVOID)ThreadParms[i],0,NULL); } DWORD d2=GetTickCount(); WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);----等待的时间变长了不知道是因为什么 难道我的WaitForMultipleObjects会等待调用我dll的主程序里面的线程??? 程序的CPU使用率变低了,执行所需要的时间也就变长了,要等待所有线程结束自然也要多等一段时间,这很正常。因为是多线程同时运行,其中一个线程执行等待的时候,其它线程在运行,所以不会降低CPU的使用率,不是这里的问题。 检查一下线程函数. 等待多个线程的时候,即使有一个线程没完成也会拖延WaitForMultipleObjects()等待时间. 当内存不足,系统动用虚拟内存的时候,CPU利用率会降低至10%以下。 怀疑问题可能是出在消息处理上,你的dll是否与主程序频繁通过sendmessage通信? 你是不是在主进程中创建线程,然后用WaitForMultipleObjects?这会阻塞主进程的消息处理用MsgWaitForMultipleObjects exe使用的是单核模式,没有针对多核进行特别优化 --- 仅仅是猜测 还有一个可能,你的dllmain是怎么处理DLL_THREAD_ATTACH/DLL_THREAD_DETACH的? 你每个创建/删除的线程都会调用dllmain的 代码在exe中和在dll中是没有差别的,有可能exe程序做了一些特殊的控制,例如设置进程只能在一个处理器上运行。 唉 刚才查出来了问题的所在,我用的两个线程,在线程的计算中 dll 和exe所花 的时间没有区别 但是 在WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);后 ,dll的运算时间增加了 800毫秒左右,而且无论是申请单线程和双线程的情况均如此。。CpuNumbers=1或CpuNumbers=2. 不是很清楚你的意思,你在DLL和EXE中不都是执行WaitForMultipleObjects等待吗?如果是双核分别运行你的线程,在只剩最后一个线程的时候,另一个处理器就空闲了,所以CPU不会一直100%。 回楼上的 是 在exe里面我可以运行到 100% 但是dll 只有不到30% 2线程的时候 而且dll中虽然运行时间长但是也可以得到正确的结果和exe的结果一样 太颓了 最后了出现这样的问题,本来都准备交项目了 你在EXE和DLL中执行的代码都是相同的吧?你可以这样试一下,自己另做一个EXE程序来加载这个DLL,如果可以达到100%就说明问题出在EXE程序上。 过低?难道楼主想CPU使用率达到100%? 回楼上的: 是啊 因为计算量较大,所以才用双线程的 在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 mfc对话框不显示,为什么 OnDraw函数 如何判断数据包经过外网回来? Invalidate() question.. 关于Access数据库 一个关于AfxMessageBox的疑难问题 程序中怎麼引用沒有給lib文件的dll 中的api 函數(只有一個dll文件和dll里面函數說明的文件)謝謝!! 问专家:Xtreme Toolkit 2.00 中文 怎样在VC中得到VBScript函数的返回值 我是VC菜鸟,请高手指教 08下的一个错误!!!!!!!!!! 怎么处理DX 的BUTTEN?
我程序中 多线程的等待都是 WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);而且在单独以exe运行时,基本可以保证总是 100%左右,这样速度很快,现在总是 30%左右,速度太慢了
DWORD d1 = GetTickCount();
HANDLE *h=new HANDLE[CpuNumbers];//修改了
for(i=0;i<CpuNumbers;i++)
{
h[i]=::CreateThread(NULL,0,ThreadImage_MI,(LPVOID)ThreadParms[i],0,NULL);
}
DWORD d2=GetTickCount();
WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);----等待的时间变长了
不知道是因为什么 难道我的WaitForMultipleObjects会等待调用我dll的主程序里面的线程???
因为是多线程同时运行,其中一个线程执行等待的时候,其它线程在运行,所以不会降低CPU的使用率,不是这里的问题。
你的dll是否与主程序频繁通过sendmessage通信?
这会阻塞主进程的消息处理
用MsgWaitForMultipleObjects
但是 在WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);后 ,dll的运算时间增加了 800毫秒左右,而且无论是申请单线程和双线程的情况均如此。。CpuNumbers=1或CpuNumbers=2.
如果是双核分别运行你的线程,在只剩最后一个线程的时候,另一个处理器就空闲了,所以CPU不会一直100%。
你可以这样试一下,自己另做一个EXE程序来加载这个DLL,如果可以达到100%就说明问题出在EXE程序上。
然后,今天做个一个试验,就是在线程里写了一个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