今天寫了一個測試多線程的程序,線程函數如下所示:
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的時間會較少,界面會顯得很卡。
因此,可以減少線程運行的個數,或者降低工作線程的優先級。