1. 程式人生 > >多執行緒執行CPU過高問題

多執行緒執行CPU過高問題

在專案開發過程中使用到多執行緒技術,有時程式執行起來佔用CPU很高(具體佔用多少,跟你的CPU核數有關。若是單核,可能直接100%),應該以release版本的執行的情況為準(因為若是多個子執行緒間的阻塞沒處理好,可能除錯過程中檢視的CPU佔用並不高)。這種問題,一般都是在多執行緒的處理中,有死迴圈了。

解決辦法:

找到所有的執行緒處理函式並在入口打上斷點,耐心的一步步除錯,只要堅信問題的存在,最後總是會找出問題的。

CPU佔用高不高,跟你的執行緒數多少沒有太多的影響。因為若你CPU是雙核,即使只建立了2個子執行緒,而這兩個子執行緒是2個死迴圈,此時你的CPU佔用也會是相當的高的。

不信的可以直接試試。

CPU佔用高不高也不能只看本程式執行起來的CPU佔用率,因為若是你的程式使用了核心物件的呼叫,那麼在工作管理員中你會看到你的程式佔用CPU是不高的,但使用到核心物件在核心呼叫中的那些服務程式就會顯示CPU佔用高。

int _tmain(int argc, _TCHAR* argv[])
{
	InitializeCriticalSection(&m_gCriticalSection);
	//一個執行緒最多可以掛起 MAXIMUM_SUSPEND_COUNT次,即127次
	//執行緒1
	unsigned threadID;
	hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc1, NULL, 0, &threadID);
	
	//執行緒2
	unsigned threadID2;
	hThread2 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc2, NULL, 0, &threadID2);
	return 0;
}
unsigned __stdcall ThreadProc1(void* pParam)
{
	//列印數字iCount
	if(0 == m_gCount)
	{
		Sleep(2000);
	}

	while(1)
	{
		EnterCriticalSection(&m_gCriticalSection);
		m_gCount++;
		<span style="color:#ff0000;">cout << "執行緒一:" << m_gCount << endl; //兩個執行緒函式中的的這句不註釋掉,該程式在任務管理中顯示佔用的CPU是不高的,但核心呼叫佔用CPU很高</span>
<span style="color:#ff0000;">						  //若是註釋掉,則程式在工作管理員中顯示佔用的CPU就會很高
</span>		LeaveCriticalSection(&m_gCriticalSection);
		
		//Sleep(1000);
	}

	return 0;
}

unsigned __stdcall ThreadProc2(void* pParam)
{
	//列印數字iCount
	while(1)
	{
		EnterCriticalSection(&m_gCriticalSection);
		m_gCount++;
		<span style="color:#ff0000;">cout << "另一執行緒:" << m_gCount << endl; 
</span>		LeaveCriticalSection(&m_gCriticalSection);
		
		//Sleep(1000);
	}

	return 0;
}