用Process Explorer分析进程各个线程CPU占用率

使用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,可以查看某个线程此时的运行堆栈。

猜你喜欢

转载自blog.csdn.net/zhushentian/article/details/79589344