使用Process Explorer可以很方便查看某个进程各个线程的CPU占用率,可以为排查问题提供帮助。我使用的Process Explorer版本是v16.21 64bit。
使用VS 2008创建一个MFC对话框程序,在代码中创建两个线程,如下:
m_thread = (HANDLE)_beginthreadex(NULL,1024,m_thread_func,(void*)this,NULL,&m_rcvthreadid);
unsigned int thradii ;
HANDLE m_thread2 = (HANDLE)_beginthreadex(NULL,1024,m_thread_func2,(void*)this,NULL,&thradii);
char sss[128];
sprintf(sss,"thread %d ,thread %d.",m_rcvthreadid,thradii);
MessageBox(sss,"",MB_OK);
代码中,我们把两个线程的TID打印出来,方便对照。
两个线程的内容如下:
UINT WINAPI m_thread_func(void *param_)
{
while(1)
{
}
return 0;
}
UINT WINAPI m_thread_func2(void *param_)
{
int cunt = 0;
while(1)
{
if(cunt++ %4096 == 0)
Sleep(1);
}
return 0;
}
其中一个线程什么都不做,死循环,也不休眠,我们猜测这样会占用一个CPU线程满负荷运行;另一个线程隔一段时间休眠1ms,我们猜测这个线程基本不会占CPU。
运行:
第一个死循环不休眠的TID是296,第二个线程TID是2920.
然后我们打开Process Exploer:
我们看到进程占了12.51%的CPU,我们想知道到底是哪个线程占用的,在该进程上右键,选择Properties...:
切换到Threads标签页,可以看到绝大部分CPU是被TID为296的线程占用,而296正是我们创建的第一个线程,死循环,不休眠,因为我的电脑是i7-2630QM,4核心,8线程,因此它占了1/8,也即0.125 = 12.5%。点击Stack,可以查看某个线程此时的运行堆栈。