Sdílet prostřednictvím


Datové struktury pro paralelní programování

.NET poskytuje několik typů, které jsou užitečné v paralelním programování, včetně sady souběžných tříd kolekce, jednoduchých primitiv synchronizace a typů pro opožděnou inicializaci. Tyto typy můžete použít s libovolným kódem vícevláknové aplikace, včetně knihovny Task Parallel Library a PLINQ.

Souběžné třídy kolekce

Třídy kolekcí v System.Collections.Concurrent oboru názvů poskytují operace přidávání a odebírání vláken, které se vyhýbají zámkům, kdykoli je to možné, a používají jemně odstupňované uzamčení tam, kde jsou zámky nezbytné. Souběžná třída kolekce nevyžaduje, aby kód uživatele při přístupu k položkám zamkl. Souběžné třídy kolekcí mohou výrazně zlepšit výkon nad typy, jako System.Collections.ArrayList jsou a System.Collections.Generic.List<T> (s uzamykáním implementovaným uživatelem) ve scénářích, kdy více vláken přidává a odebírá položky z kolekce.

Následující tabulka uvádí třídy souběžných kolekcí:

Typ Popis
System.Collections.Concurrent.BlockingCollection<T> Poskytuje možnosti blokování a ohraničování pro kolekce bezpečné pro vlákna, které implementují System.Collections.Concurrent.IProducerConsumerCollection<T>. Vlákna producenta blokují, pokud nejsou k dispozici žádné sloty nebo pokud je kolekce plná. Vlákna příjemce blokují, pokud je kolekce prázdná. Tento typ také podporuje neblokující přístup spotřebitelů a výrobců. BlockingCollection<T> lze použít jako základní třídu nebo záložní úložiště k zajištění blokování a ohraničování pro všechny třídy kolekce, které podporují IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> Implementace kontejneru bezpečného pro přístup z více vláken, která poskytuje škálovatelné operace přidání a získání.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Souběžný a škálovatelný typ slovníku.
System.Collections.Concurrent.ConcurrentQueue<T> Souběžná a škálovatelná fronta FIFO.
System.Collections.Concurrent.ConcurrentStack<T> Souběžný a škálovatelný zásobník LIFO.

Další informace naleznete v tématu Kolekce thread-Sejf.

Primitivy synchronizace

Primitivy synchronizace v System.Threading oboru názvů umožňují jemně odstupňovanou souběžnost a rychlejší výkon tím, že se vyhnete drahým mechanismům uzamčení nalezeným ve starším vícevláknovém kódu.

Následující tabulka uvádí typy synchronizace:

Typ Popis
System.Threading.Barrier Umožňuje paralelní práci s algoritmem několika vlákny tím, že poskytne bod, ve kterém může každý úkol signalizovat jeho příchod a pak blokovat, dokud některé nebo všechny úkoly nedorazí. Další informace naleznete v tématu Barrier.
System.Threading.CountdownEvent Zjednodušuje scénáře rozvětvování a spojení tím, že poskytuje snadný mechanismus setkání. Další informace naleznete v tématu CountdownEvent.
System.Threading.ManualResetEventSlim Primitivní synchronizace podobná System.Threading.ManualResetEvent. ManualResetEventSlim je lehčí, ale lze ji použít pouze pro komunikaci uvnitř procesu.
System.Threading.SemaphoreSlim Primitivní synchronizace, která omezuje počet vláken, která můžou souběžně přistupovat k prostředku nebo fondu prostředků. Další informace naleznete v tématu Semaphore a SemaphoreSlim.
System.Threading.SpinLock Primitiva vzájemného vyloučení, které způsobí, že vlákno, které se pokouší získat zámek čekat ve smyčce nebo spinu, po určitou dobu před tím, než získá kvantový kvant. Ve scénářích, ve kterých se očekává, že čekání na zámek bude krátké, SpinLock nabízí lepší výkon než jiné formy uzamčení. Další informace naleznete v tématu SpinLock.
System.Threading.SpinWait Malý jednoduchý typ, který se bude otáčet po určitou dobu, a nakonec vložte vlákno do stavu čekání, pokud je překročen počet čísel. Další informace naleznete v tématu SpinWait.

Další informace naleznete v tématu:

Opožděné inicializační třídy

Při opožděné inicializaci není paměť objektu přidělena, dokud nebude potřeba. Opožděné inicializace může zlepšit výkon rozložením přidělení objektů rovnoměrně po celou dobu životnosti programu. Opožděné inicializace pro libovolný vlastní typ můžete povolit zabalením typu Lazy<T>.

Následující tabulka uvádí typy opožděné inicializace:

Typ Popis
System.Lazy<T> Poskytuje odlehčenou opožděnou inicializaci s bezpečným vláknem.
System.Threading.ThreadLocal<T> Poskytuje lazily inicializovanou hodnotu pro každé vlákno, přičemž každé vlákno lazily-vyvolá inicializační funkci.
System.Threading.LazyInitializer Poskytuje statické metody, které zabrání přidělení vyhrazené, opožděné inicializační instance. Místo toho používají odkazy k zajištění inicializace cílů při přístupu.

Další informace naleznete v tématu Opožděná inicializace.

Agregační výjimky

Typ System.AggregateException lze použít k zachycení více výjimek, které jsou vyvolány souběžně v samostatných vláknech, a vrátit je do spojovacího vlákna jako jedinou výjimku. Pro System.Threading.Tasks.Task tento účel se tyto typy a System.Threading.Tasks.Parallel typy a PLINQ používají AggregateException široce. Další informace naleznete v tématu Zpracování výjimek a postupy: Zpracování výjimek v plINQ dotazu.

Viz také