Adatstruktúrák párhuzamos programozáshoz

A .NET számos olyan típust biztosít, amelyek hasznosak a párhuzamos programozásban, beleértve az egyidejű gyűjteményosztályokat, az egyszerűsített szinkronizálási primitíveket és a lusta inicializáláshoz szükséges típusokat. Ezeket a típusokat bármilyen többszálú alkalmazáskóddal használhatja, beleértve a feladat párhuzamos kódtárát és a PLINQ-t.

Egyidejű gyűjteményosztályok

A névtér gyűjteményosztályai System.Collections.Concurrent szálbiztos hozzáadási és eltávolítási műveleteket biztosítanak, amelyek lehetőség szerint elkerülik a zárolásokat, és finomított zárolást használnak, ahol szükség van a zárolásokra. Az egyidejű gyűjteményosztályok nem követelik meg, hogy a felhasználói kód zárolja az elemeket. Az egyidejű gyűjteményosztályok jelentősen javíthatják a teljesítményt az olyan típusok esetében, mint például System.Collections.ArrayList a System.Collections.Generic.List<T> felhasználó által implementált zárolás, és olyan helyzetekben, amikor több szál is hozzáad és eltávolít elemeket egy gyűjteményből.

Az alábbi táblázat az egyidejű gyűjteményosztályokat sorolja fel:

Típus Leírás
System.Collections.Concurrent.BlockingCollection<T> Letiltási és határolóképességet biztosít az implementáló System.Collections.Concurrent.IProducerConsumerCollection<T>szálbiztos gyűjteményekhez. A gyártói szálak blokkolják, ha nincsenek rendelkezésre álló pontok, vagy ha a gyűjtemény megtelt. A fogyasztói szálak blokkolják, ha a gyűjtemény üres. Ez a típus támogatja a fogyasztók és gyártók hozzáférésének letiltását is. BlockingCollection<T> alaposztályként vagy háttértárként is használható, amely letiltást és határolókeretet biztosít minden olyan gyűjteményosztály számára, amely támogatja IEnumerable<T>a .
System.Collections.Concurrent.ConcurrentBag<T> Egy szálbiztos zsák implementáció, amely skálázható hozzáadási és lekérési műveleteket biztosít.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Egyidejű és méretezhető szótártípus.
System.Collections.Concurrent.ConcurrentQueue<T> Egyidejű és méretezhető FIFO-üzenetsor.
System.Collections.Concurrent.ConcurrentStack<T> Egyidejű és méretezhető LIFO-verem.

További információ: Thread-Széf Collections.

Szinkronizálási primitívek

A névtérben lévő szinkronizálási primitívek lehetővé teszik a System.Threading részletes egyidejűséget és a gyorsabb teljesítményt azáltal, hogy elkerülik az örökölt többszálú kódban található költséges zárolási mechanizmusokat.

Az alábbi táblázat a szinkronizálási típusokat sorolja fel:

Típus Leírás
System.Threading.Barrier Lehetővé teszi, hogy több szál párhuzamosan működjön egy algoritmuson azáltal, hogy megad egy pontot, ahol minden tevékenység jelezheti az érkezését, majd blokkolhatja, amíg néhány vagy az összes tevékenység meg nem érkezik. További információ: Barrier.
System.Threading.CountdownEvent Egyszerű rendezésű mechanizmussal egyszerűsíti az elágazásos és illesztő forgatókönyveket. További információ: CountdownEvent.
System.Threading.ManualResetEventSlim A szinkronizálási primitív hasonló System.Threading.ManualResetEvent. ManualResetEventSlim kisebb súlyú, de csak a folyamaton belüli kommunikációhoz használható.
System.Threading.SemaphoreSlim A szinkronizálási primitív, amely korlátozza az erőforrásokhoz vagy erőforráskészletekhez egyidejűleg hozzáférő szálak számát. További információ: Semaphore és SemaphoreSlim.
System.Threading.SpinLock A kölcsönös kizárási zár primitív, amely miatt a szál, amely megpróbálja megszerezni a zárolást várni egy hurok, vagy spin, egy ideig, mielőtt a hozam a kvantum. Azokban az esetekben, amikor a zárolásra való várakozás várhatóan rövid lesz, jobb teljesítményt nyújt, SpinLock mint más zárolási formák. További információ: SpinLock.
System.Threading.SpinWait Egy kis, könnyű típus, amely meghatározott ideig pörög, és végül várakozási állapotba helyezi a szálat, ha túllépi a pörgetések számát. További információ: SpinWait.

További információkért lásd:

Lusta inicializálási osztályok

Lusta inicializálás esetén az objektum memóriája csak akkor van lefoglalva, ha szükség van rá. A lusta inicializálás javíthatja a teljesítményt azáltal, hogy egyenletesen szórja el az objektumfoglalásokat a program teljes élettartama alatt. A lusta inicializálást bármely egyéni típushoz engedélyezheti a típus Lazy<T>körbefuttatásával.

Az alábbi táblázat a lusta inicializálási típusokat sorolja fel:

Típus Leírás
System.Lazy<T> Egyszerű, szálbiztos lusta inicializálást biztosít.
System.Threading.ThreadLocal<T> Lazily-inicializált értéket biztosít szálonként, és mindegyik szál lustán inicializálja az inicializálási függvényt.
System.Threading.LazyInitializer Statikus metódusokat biztosít, amelyek nem igényelnek dedikált, lusta inicializálási példányt. Ehelyett hivatkozásokkal biztosítják, hogy a célok inicializálása a hozzáférésük során történjen.

További információ: Lusta inicializálás.

Kivételek összesítése

Ez a System.AggregateException típus több kivétel rögzítésére használható, amelyek egyidejűleg külön szálakra kerülnek, és egyetlen kivételként visszakerülnek az illesztőszálba. A System.Threading.Tasks.Task típusokat és System.Threading.Tasks.Parallel a PLINQ-t széles körben használják AggregateException erre a célra. További információ: Kivételkezelés és útmutató: Kivételek kezelése PLINQ-lekérdezésekben.

Lásd még