多執行緒執行CPU過高問題
阿新 • • 發佈:2019-01-25
在專案開發過程中使用到多執行緒技術,有時程式執行起來佔用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;
}