警惕執行緒的優先順序

weixin_33860553發表於2012-04-19

執行緒在C#中有5個優先順序:Highest、AboveNormal、Normal、BelowNormal和Lowest。講到執行緒的優先順序,就 會涉及執行緒的排程。Windows系統是一個基於優先順序的搶佔式排程系統。在系統中,如果有一個執行緒的優先順序較高,並且它正好處在就緒狀態,系統總是會優 先執行該執行緒。換句話說,高優先順序的執行緒總是在系統排程演算法中獲取更多的CPU執行時間。

我們可以在一個單CPU系統中測試下面的程式碼:

  1. static void Main(string[] args)  
  2. {  
  3.     long t1Num = 0;  
  4.     long t2Num = 0;  
  5.     CancellationTokenSource cts = new CancellationTokenSource();  
  6.       
  7.     Thread t1 = new Thread(() => 
  8.     {  
  9.         while (true && !cts.Token.IsCancellationRequested)  
  10.         {  
  11.             t1Num++;  
  12.         }  
  13.     });  
  14.     t1.IsBackground = true;  
  15.     t1.Priority = ThreadPriority.Highest;  
  16.     t1.Start();  
  17.  
  18.     Thread t2 = new Thread(() => 
  19.     {  
  20.         while (true && !cts.Token.IsCancellationRequested)  
  21.         {  
  22.             t2Num++;  
  23.         }  
  24.     });  
  25.     t2.IsBackground = true;  
  26.     t2.Start();  
  27.       
  28.     Console.ReadLine();  
  29.     //停止執行緒  
  30.     cts.Cancel();  
  31.     Console.WriteLine("t1Num:" + t1Num.ToString());  
  32.     Console.WriteLine("t2Num:" + t2Num.ToString());  

結果我們會發現,如果這段程式執行在單核計算機中,優先順序為Highest的執行緒t1,其輸出值幾乎總是會大於優先順序為Normal(預設)的執行緒t2。

在C#中,使用Thread和ThreadPool新起的執行緒,預設優先順序都是Normal。雖然可以像上面的示例那樣去修改執行緒的優先順序,但是一 般不建議這樣做。當然,如果是一些非常關鍵的執行緒,我們還是可以提升執行緒的優先順序的。這些關鍵執行緒應當具有執行時間短、能即刻進入等待狀態等特徵。

相關文章