生活随笔
收集整理的這篇文章主要介紹了
多线程执行CPU过高问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在項目開發過程中使用到多線程技術,有時程序運行起來占用CPU很高(具體占用多少,跟你的CPU核數有關。若是單核,可能直接100%),應該以release版本的運行的情況為準(因為若是多個子線程間的阻塞沒處理好,可能調試過程中查看的CPU占用并不高)。這種問題,一般都是在多線程的處理中,有死循環了。
解決辦法:
找到所有的線程處理函數并在入口打上斷點,耐心的一步步調試,只要堅信問題的存在,最后總是會找出問題的。
?
CPU占用高不高,跟你的線程數多少沒有太多的影響。因為若你CPU是雙核,即使只創建了2個子線程,而這兩個子線程是2個死循環,此時你的CPU占用也會是相當的高的。
不信的可以直接試試。
CPU占用高不高也不能只看本程序運行起來的CPU占用率,因為若是你的程序使用了內核對象的調用,那么在任務管理器中你會看到你的程序占用CPU是不高的,但使用到內核對象在內核調用中的那些服務程序就會顯示CPU占用高。
[cpp]?view plaincopyprint?
int?_tmain(int?argc,?_TCHAR*?argv[])?? {?? ????InitializeCriticalSection(&m_gCriticalSection);?? ?????? ?????? ????unsigned?threadID;?? ????hThread1?=?(HANDLE)_beginthreadex(NULL,?0,?ThreadProc1,?NULL,?0,?&threadID);?? ?????? ?????? ????unsigned?threadID2;?? ????hThread2?=?(HANDLE)_beginthreadex(NULL,?0,?ThreadProc2,?NULL,?0,?&threadID2);??
[cpp]?view plaincopyprint?
return?0;??
[cpp]?view plaincopyprint?
unsigned?__stdcall?ThreadProc1(void*?pParam)?? {?? ?????? ????if(0?==?m_gCount)?? ????{?? ????????Sleep(2000);?? ????}?? ?? ????while(1)?? ????{?? ????????EnterCriticalSection(&m_gCriticalSection);?? ????????m_gCount++;?? ????????<span?style="color:#ff0000;">cout?<<?"線程一:"?<<?m_gCount?<<?endl;???
[cpp]?view plaincopyprint?
<span?style="color:#ff0000;">????????????????????????? </span>???????LeaveCriticalSection(&m_gCriticalSection);?? ?????????? ?????????? ????}?? ?? ????return?0;?? }?? ?? unsigned?__stdcall?ThreadProc2(void*?pParam)?? {?? ?????? ????while(1)?? ????{?? ????????EnterCriticalSection(&m_gCriticalSection);?? ????????m_gCount++;?? ????????<span?style="color:#ff0000;">cout?<<?"另一線程:"?<<?m_gCount?<<?endl;??? </span>???????LeaveCriticalSection(&m_gCriticalSection);?? ?????????? ?????????? ????}?? ?? ????return?0;?? }??
總結
以上是生活随笔為你收集整理的多线程执行CPU过高问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。