1. 程式人生 > >.NET並行計算和並發5:多線程編程一般指導性原則

.NET並行計算和並發5:多線程編程一般指導性原則

fin 原子 並發 主程 his 必須 auto span 語句

  1 使用多線程時要考慮以下準則:
  2 不要使用 Thread.Abort 終止其他線程。  對另一個線程調用 Abort 無異於引發該線程的異常,也不知道該線程已處理到哪個位置。
  3 不要使用 Thread.Suspend 和 Thread.Resume 同步多個線程的活動。  請使用 Mutex、ManualResetEvent、AutoResetEvent 和 Monitor。
  4 不要從主程序中控制輔助線程的執行(如使用事件),  而應在設計程序時讓輔助線程負責等待任務,執行任務,並在完成時通知程序的其他部分。  
如果不阻止輔助線程,請考慮使用線程池線程。  如果阻止輔助線程,Monitor.PulseAll 會很有幫助。
  5
不要將類型用作鎖定對象。 例如,避免在 C# 中使用 lock(typeof(X)) 代碼,或在 Visual Basic 中使用 SyncLock(GetType(X)) 代碼,
或將 Monitor.Enter 和 Type 對象一起使用。  對於給定類型,每個應用程序域只有一個 System.Type 實例。 
 如果您鎖定的對象的類型是 public,您的代碼之外的代碼也可鎖定它,但會導致死鎖。  有關其他信息,請參見可靠性最佳做法。
  6 鎖定實例時要謹慎,例如,C# 中的 lock(this) 或 Visual Basic 中的 SyncLock(Me)。  如果您的應用程序中不屬於該類型的其他代碼鎖定了該對象,則會發生死鎖。
  7
一定要確保已進入監視器的線程始終離開該監視器,即使當線程在監視器中時發生異常也是如此。 C# 的 lock 語句和 Visual Basic 的 SyncLock 語句可自動提供此行為,它們用一個 finally 塊來確保調用 Monitor.Exit。 如果無法確保調用 Exit,請考慮將您的設計更改為使用 Mutex。 Mutex 在當前擁有它的線程終止後會自動釋放。 8 一定要針對那些需要不同資源的任務使用多線程,避免向單個資源指定多個線程。 例如,任何涉及 I/O 的任務都會從其擁有其自己的線程這一點得到好處,因為此線程在 I/O 操作期間將阻止,從而允許其他線程執行。 用戶輸入是另一種可從專用線程獲益的資源。 在單處理器計算機上,涉及大量計算的任務可與用戶輸入和涉及 I/O 的任務並存,但多個計算量大的任務將相互競爭。 9
對於簡單的狀態更改,請考慮使用 Interlocked 類的方法,而不是 lock 語句(在 Visual Basic 中為 SyncLock)。 lock 語句是一個優秀的通用工具,但是 Interlocked 類為必須是原子性的更新提供了更好的性能。 如果沒有爭奪,它會在內部執行一個鎖定前綴。

.NET並行計算和並發5:多線程編程一般指導性原則