編寫高品質代碼改善C#程式的157個建議——建議78:應避免線程數量過多

來源:互聯網
上載者:User

標籤:

建議78:應避免線程數量過多

在多數情況下,建立過多的線程意味著應用程式的架構設計可能存在著缺陷。經常有人會問,一個應用程式中到底含有多少線程才是合理的。現在我們找一台PC機,開啟Windows的工作管理員,看看作業系統中正在啟動並執行程式有多少個線程。

在筆者當前的PC機上,線程數最多的一個應用程式是某款殺毒軟體,它一共擁有116個線程數;其次是Windows自身的System進程,當前共有104個線程;第三多的進程是Sqlservr.exe,銳減到了35個線程;剩下還有63個進程,估計它們平均約有10個線程。所以說,大多數應用程式的線程數不會太多。

錯誤地建立過多線程的一個典型的例子是:為每一個Socket串連建立一個線程去管理。每個串連一個線程,意味著在32位系統的伺服器不能同時管理超過約1000台的客戶機。CLR為每個線程分配的記憶體會超過1MB。約1000個線程,加上.NET進程啟動本身所佔用的一些記憶體,即刻就耗盡了系統能分配給進程的最大可用地址空間2GB。即便應用程式在設計之初的需求設計書中說明,生產環境中用戶端數目不會超過500台,在管理這500台用戶端時進行線程環境切換,也會損耗相當多的CPU時間。這類I/O密集型場合應該使用非同步去完成(請參考建議71的相關闡述)。

過多的線程還會帶來另外的問題:新起的線程可能需要等待相當長的時間才會真正運行。這是一個相當無奈的結果,在多數情況下,我們都不能忍受等待這麼長時間。以下的這段測試代碼,在雙核系統中,經過了大概5分鐘的時間,才運行到了線程T201:

static void Main(string[] args)  {      for (int i = 0; i < 200; i++)      {          Thread t = new Thread(() =>            {                  int j = 1;                  while (true)                  {                      j++;                  }              });          t.IsBackground = true;          t.Start();      }      Thread.Sleep(5000);      Thread t201 = new Thread(() =>        {              while (true)              {                  Console.WriteLine("T201正在執行");              }          });      t201.Start();      Console.ReadKey();  } 


除了啟動問題外,線程之間的切換也存在同樣的問題,T201的下一次執行,還會等待相當長的時間。

所以,不要濫用線程,尤其不要濫用過多的線程。當新起線程的時候,需要仔細思考這項工作是否真的需要新起線程去完成。即使真的需要線程也應該考慮使用線程池技術。例如本建議所提到的Socket串連這樣的I/O密集型場合,應當始終考慮使用非同步來完成。非同步會在後台使用線程池進行管理。1000台用戶端在使用了非同步技術後,實際只要幾個線程就能完成所有的管理工作(具體取決於“心跳頻率”)。

 

 

轉自:《編寫高品質代碼改善C#程式的157個建議》陸敏技

編寫高品質代碼改善C#程式的157個建議——建議78:應避免線程數量過多

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.