多線程爲什麼會卡

今天寫了一個測試多線程的程序,線程函數如下所示:

UINT ThreadFunction(LPVOID lp)
{
int i,j,k;
int a;
for(i=0;i<=1000;i++)//ºÄʱ
for(j=0;j<=1000;j++)
for(k=0;k<=1000;k++)
{
a=i+j+k;
}
AfxMessageBox("多線程運算結束");
return 0;
}

發現當同時打開打開多個這樣的線程時,界面就會顯得很卡,當打開一個就不會卡。

問了一些人他們說,for循環太多,導致程序太卡,將for循環減少循環嵌套爲一個時發現不卡(因爲線程瞬間執行完了),但如果這樣如何讓線程來執行耗時任務呢?

上網搜了一下線程調度和管理的資料(具體參見操作系統),知道線程調度的基本規律:

1.線程會一直或大部分時間執行高優先級的線程。

2.有多個同等優先級的線程就會按CPU時間片進行循環執行。


而我的程序各個線程的優先級是相同的,這樣來看,界面卡的原因不是for循環太多,而是線程個數太多,當時有個哥們給我說建立一個線程池,別運行那麼多的線程,現在看來是對的。但爲什麼線程多了就卡?因爲對於相同優先級的線程,cpu時間以時間片爲單位循環執行各個線程,因爲我們的線程函數需要一定的時間因此會花掉整個cpu的時間片,假設同時打開5個這樣的線程,再加上1個主線程。也就是說主線程會每6*時間片的時間纔會執行一次,這樣的話主線程得到cpu的時間會較少,界面會顯得很卡。

因此,可以減少線程運行的個數,或者降低工作線程的優先級。

發佈了21 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章