Share via


適用於平行程式設計的資料結構

.NET Framework 4 版引進數個在平行程式設計中很有用的新型別,包括一組並行集合類別、輕量型同步處理基本型別和用於延遲初始設定的型別。 您可以將這些型別用於任何多執行緒的應用程式程式碼中,包括工作平行程式庫和 PLINQ。

並行集合類別

System.Collections.Concurrent 命名空間中的集合類別提供具備執行緒安全的加入和移除作業,可以盡量避免鎖定,並在需要鎖定時採用細部鎖定。 與 .NET Framework 1.0 版和 2.0 版中所引進的集合不同,並行集合類別並不需要使用者程式碼在存取項目時取得任何鎖定。 在多個執行緒於集合中加入和移除項目的案例中,並行集合類別可以提供遠高於 System.Collections.ArrayListSystem.Collections.Generic.List<T> (搭配使用者實作的鎖定) 等其他型別的效能。

下表列出新的並行集合類別:

型別

說明

System.Collections.Concurrent.BlockingCollection<T>

提供安全執行緒集合適用的封鎖和界限容量,此集合會實作 System.Collections.Concurrent.IProducerConsumerCollection<T>。 如果沒有位置可用或是集合已滿,則 Producer 執行緒會封鎖。 如果集合是空的,則 Consumer 執行緒會封鎖。 這個型別也支援讓消費者與生產者進行非封鎖性存取。 BlockingCollection<T> 可以做為基底類別或備份存放區,以提供封鎖和界限給任何支援 IEnumerable<T> 的集合類別。

System.Collections.Concurrent.ConcurrentBag<T>

執行緒安全的陣列實作,提供可擴充的加入和取得作業。

System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>

並行和可擴充的字典型別。

System.Collections.Concurrent.ConcurrentQueue<T>

並行和可擴充的 FIFO 佇列。

System.Collections.Concurrent.ConcurrentStack<T>

並行和可擴充的 LIFO 堆疊。

如需詳細資訊,請參閱安全執行緒集合

同步處理原始物件

System.Threading 命名空間中新的同步處理原始型別可以達到更細部的並行處理,並且透過避免舊版多執行緒程式碼中高度耗費資源的鎖定機制,達到更快的效能。 部分新型別 (例如 System.Threading.BarrierSystem.Threading.CountdownEvent) 在舊版 .NET Framework 中有沒有對應的版本。

下表列出新的同步處理型別:

型別

說明

System.Threading.Barrier

透過提供一個點讓每個工作告知其已抵達,然後封鎖到部分或所有工作都已抵達為止的方式,讓多個執行緒以平行方式處理演算法。 如需詳細資訊,請參閱 屏障 (.NET Framework)

System.Threading.CountdownEvent

提供簡易 Rendezvous 機制來簡化分岔和聯結案例。 如需詳細資訊,請參閱 CountdownEvent

System.Threading.ManualResetEventSlim

System.Threading.ManualResetEvent 類似的同步處理基本型別。 ManualResetEventSlim 屬於輕量型基本型別,但只能用於同處理序通訊。 如需詳細資訊,請參閱 ManualResetEvent 和 ManualResetEventSlim

System.Threading.SemaphoreSlim

同步處理基本型別,限制可以並行存取資源或資源集區的執行緒數目。 如需詳細資訊,請參閱 Semaphore 和 SemaphoreSlim

System.Threading.SpinLock

互斥鎖定基本型別,會讓嘗試取得鎖定的執行緒先在迴圈中等候 (或「空轉」(Spin)) 一段時間再產生配量。 在預期不需等太久時間來取得鎖定的案例中,SpinLock 會比其他鎖定形式提供更好的效能。 如需詳細資訊,請參閱 SpinLock

System.Threading.SpinWait

小型、輕量的型別,會空轉一段指定的時間,並在最後超過空轉計數時,讓執行緒進入等候狀態。 如需詳細資訊,請參閱 SpinWait

如需詳細資訊,請參閱:

延遲初始設定類別

使用延遲初始設定時,只有在需要物件時才會配置物件的記憶體。 延遲初始設定可以將物件的配置均勻分散在程式的整個存留期中,進而改善效能。 您可以透過包裝 Lazy<T> 型別,來針對任何自訂型別啟用延遲初始設定。

下表列出延遲初始設定型別:

型別

說明

System.Lazy<T>

提供輕量、具備執行緒安全的延遲初始設定。

System.Threading.ThreadLocal<T>

以個別執行緒為單位提供延遲初始化值,每個執行緒都會延遲叫用初始設定函式。

System.Threading.LazyInitializer

提供靜態方法,這些方法使得專門配置一個延遲初始設定執行個體變得不再需要。 它們會改用參考來確保所存取的目標已初始化。

如需詳細資訊,請參閱延遲初始設定

彙總例外狀況

System.AggregateException 型別可用來擷取不同執行緒同時擲回的多個例外狀況,然後將這些例外狀況當成單一例外狀況傳回給聯結的執行緒。 System.Threading.Tasks.TaskSystem.Threading.Tasks.Parallel 型別以及 PLINQ 會廣泛地使用 AggregateException 來達成這個目的。 如需詳細資訊,請參閱 HOW TO:處理工作擲回的例外狀況HOW TO:處理 PLINQ 查詢中的例外狀況

請參閱

參考

System.Collections.Concurrent

System.Threading

概念

以 .NET Framework 進行平行程式設計