Dela via


Datastrukturer för parallell programmering

.NET innehåller flera typer som är användbara i parallell programmering, inklusive en uppsättning samtidiga samlingsklasser, enkla synkroniseringsprimitiver och typer för lat initiering. Du kan använda dessa typer med vilken som helst flertrådad applikationskod, inklusive Task Parallel Library (TPL) och PLINQ.

Samtidiga samlingsklasser

Samlingsklasserna i System.Collections.Concurrent namnområdet tillhandahåller trådsäkra operationer för att lägga till och ta bort, som undviker lås där det är möjligt och använder finfördelad låsning där lås krävs. En samtidig samlingsklass kräver inte att användarkoden tar några lås när den kommer åt objekt. De samtidiga samlingsklasserna kan avsevärt förbättra prestanda för typer som System.Collections.ArrayList och System.Collections.Generic.List<T> (med användarindelad låsning) i scenarier där flera trådar lägger till och tar bort objekt från en samling.

I följande tabell visas de samtidiga samlingsklasserna:

Typ Beskrivning
System.Collections.Concurrent.BlockingCollection<T> Tillhandahåller funktioner för blockering och avgränsning för trådsäkra samlingar som implementerar System.Collections.Concurrent.IProducerConsumerCollection<T>. Producenttrådar blockeras om inga platser är tillgängliga eller om samlingen är full. Konsumenttrådar blockeras om samlingen är tom. Den här typen stöder också icke-blockerande åtkomst från konsumenter och producenter. BlockingCollection<T> kan användas som basklass eller lagringsplats för att tillhandahålla blockering och avgränsning för alla samlingsklasser som stöder IEnumerable<T>.
System.Collections.Concurrent.ConcurrentBag<T> En trådsäker påse-implementering som ger skalbara åtgärder för att lägga till och hämta.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> En samtidig och skalbar ordlistetyp.
System.Collections.Concurrent.ConcurrentQueue<T> En samtidig och skalbar FIFO-kö.
System.Collections.Concurrent.ConcurrentStack<T> En samtidig och skalbar LIFO-stack.

Mer information finns i Thread-Safe samlingar.

Synkroniserings primitiver

Synkroniseringens primitiver i System.Threading namnområdet möjliggör detaljerad samtidighet och snabbare prestanda genom att undvika dyra låsmekanismer som finns i äldre flertrådskod.

I följande tabell visas synkroniseringstyperna:

Typ Beskrivning
System.Threading.Barrier Möjliggör att flera trådar kan arbeta med en algoritm parallellt genom att skapa en punkt där varje uppgift kan signalera sin ankomst och sedan blockera tills vissa eller alla uppgifter har anlänt. Mer information finns i Barriär.
System.Threading.CountdownEvent Förenklar förgrenings- och sammanfogningsscenarier genom att tillhandahålla en enkel mötesmekanism. Mer information finns i CountdownEvent.
System.Threading.ManualResetEventSlim En synkroniseringsprimitiv liknande System.Threading.ManualResetEvent. ManualResetEventSlim är lättare men kan endast användas för kommunikation mellan processer.
System.Threading.SemaphoreSlim En synkroniseringsprimär som begränsar antalet trådar som samtidigt kan komma åt en resurs eller en resurspool. Mer information finns i Semafor och SemaphoreSlim.
System.Threading.SpinLock Ett primitivt ömsesidigt exkluderingslås som gör att tråden som försöker förvärva låset väntar i en loop, eller snurrar, under en tidsperiod innan den släpper sitt kvantum. I scenarier där väntan på låset förväntas bli kort ger SpinLock bättre prestanda än andra former av låsning. Mer information finns i SpinLock.
System.Threading.SpinWait En liten, lättviktig typ som snurrar under en angiven tid och så småningom försätter tråden i väntetillstånd om spinnantalet överskrids. Mer information finns i SpinWait.

Mer information finns i:

Lata initieringsklasser

Med lat initiering allokeras inte minnet för ett objekt förrän det behövs. Lat initiering kan förbättra prestanda genom att sprida objektallokeringar jämnt över programmets livslängd. Du kan aktivera lat initiering för alla anpassade typer genom att omsluta typen Lazy<T>.

I följande tabell visas de lata initieringstyperna:

Typ Beskrivning
System.Lazy<T> Ger lättviktig, trådsäker och enkel initiering.
System.Threading.ThreadLocal<T> Ger ett lättsinnigt initierat värde per tråd, där varje tråd lätt anropar initieringsfunktionen.
System.Threading.LazyInitializer Tillhandahåller statiska metoder som undviker behovet av att allokera en dedikerad instans med lat initiering. I stället använder de referenser för att säkerställa att målen har initierats när de nås.

Mer information finns i Lazy Initialization.

Aggregerade undantag

Typen System.AggregateException kan användas för att samla in flera undantag som genereras samtidigt på separata trådar och returnera dem till kopplingstråden som ett enda undantag. Typerna System.Threading.Tasks.Task och System.Threading.Tasks.Parallel och PLINQ använder AggregateException i stor utsträckning för detta ändamål. Mer information finns i Undantagshantering och Så här hanterar du undantag i en PLINQ-fråga.

Se även