2017-04-07 29 views
0

我需要專家對線程使用情況的建議和意見。我有一個簡單的「插件」DLL,它有2-3個線程,每個都以_beginthreadex()開頭。C++在舊版PC上執行CPU使用率問題

線程看起來是這樣的:

unsigned __stdcall Thread(void* pArguments) 
{ 
    while (true) 
    { 
     // do something 
     Sleep(3000); 
    } 
    _endthreadex(0); 
    return 0; 
} 

現在,這個線程並沒有很高的CPU使用率,它適用於大多數新PC的預期,但是我發現,對老年人的PC與雙核CPU例如,使用這種線程方法運行2-3個實例需要大量的CPU。我無法解釋自己爲什麼,我不知道該怎麼做。

我試過CreateThread()也是,但它沒有做出改變。有人可以請指導我如何創建一個線程,將在所有PC上以相同的方式運行?如果我做錯了什麼,那麼請向我解釋什麼...

謝謝!

+0

你確定你的睡眠呼叫實際上是在睡覺嗎?如果這會立即返回,你將會殺死你的線程,並以100%的CPU運行。 – tadman

+0

爲什麼你不想使用CPU? tbh我發現它有點愚蠢,試圖最大限度地減少線程的CPU使用率,而線程除了睡眠之外什麼也不做。 – user463035818

+0

好吧,它確實叫睡眠(),因爲我測試,它運行每X毫秒我放入睡眠()... –

回答

0

_beginthreadex只是CreateThread的包裝。如果你的CPU使用率很高,那麼這很可能是你的「做某事」代碼的問題,它與最初用於創建線程的方法無關。用分析器檢查你的代碼並尋找競爭條件。請注意,您發佈的代碼段實際上已被破壞,因爲循環沒有中斷,因此方法具有無法訪問的代碼。

+0

謝謝你指出,所以我的「循環」是錯誤的?我想你剛剛發現我的問題....:| –

+0

那麼,如果「你做了什麼」代碼,你省略了某處休息,那麼它並沒有被打破。請注意,這裏也不需要調用_endthreadex,因爲無論如何您都將退出線程例程。 – dodo951

+0

那麼我的「做某事」沒有休息,這是肯定的......我真的不明白爲什麼我不需要調用_endthreadex:/ –