Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 69126|Válasz: 4

[Forrás] .NET/C# Szálbiztonsági gyűjtemény (összeállítás)

[Linket másol]
Közzétéve 2017. 06. 06. 17:13:53 | | |
A .NET Framework 1.0-ban bevezetett gyűjtemények megtalálhatók a System.Collections névtérben. Ezek a gyűjtemények, beleértve a gyakran használt ArrayList és a Hashtable-t is, valamilyen szálbiztonságot biztosítanak a Synchronized tulajdonságon keresztül, amely egy szál-biztonságos wrappert ad vissza a gyűjteményhez. A csomagolás úgy működik, hogy minden hozzáadás-eltávolítás művelethez az egész készletet zárolja. Ezért minden szálnak, amely megpróbál hozzáférni a gyűjteményhez, várnia kell, amíg az ő sora a zár megszerzésére. Ez nem skálázható, és jelentős teljesítményromlást eredményez a nagy gyűjteményeknél. Ezen felül ez a kialakítás nem zárja ki teljesen a vitát. További információért lásd az MSDN honlapján található alábbi oldalt: Szinkronizáció általános gyűjteményekben

A .NET Framework 2.0-ban bevezetett gyűjteményosztály a System.Collections.Generic névtérben található. Ezek a gyűjtemény órák közé tartozik a List<T>, Dictionary< TKey, TValue> stb. Ezek az osztályok magasabb típusbiztonságot és teljesítményt nyújtanak, mint a .NET Framework 1.0 osztályok. Azonban a .NET Framework 2.0 gyűjteményosztály nem biztosít szálszinkronizációt; Amikor egyszerre több szálon elemeket adunk vagy távolítanak, a felhasználói kódnak minden szinkronizálást biztosítania kell.

Javasoljuk, hogy használj párhuzamos gyűjteményosztályokat a .NET Framework 4-ben, mert ezek nemcsak a .NET Framework 2.0 gyűjteményosztályok típusbiztonságát biztosítják, hanem hatékonyabb és teljesebb szálbiztonságot is, mint a .NET Framework 1.0 gyűjtemény által biztosított szálbiztonság.


Néhány egyidejű gyűjteménytípus könnyű szinkronizációs mechanizmusokat használ, mint például a SpinLock, SpinWait, SemaphoreSlim és CountdownEvent, amelyek újak a .NET Framework 4-ben. Általában a fenti szinkronizációs típusok rövid ideig "foglalt forgást" használnak, mielőtt a szálat tényleges várakozási állapotba helyeznék. Ha a várakozási idő nagyon rövid lesz, a pörgés sokkal kevesebb számítási erőforrást fog fogyasztani, mint a várakozás, ami kernel-átalakításokat igényel, amelyek sok erőforrást fogyasztanak. A rotációt használó gyűjtő osztályok esetében ez a hatékonyság azt jelenti, hogy több szál is nagyon gyors ütemben hozzáadhat és távolíthatja el a tárgyakat. További információért a korlátozásról és blokkolásról lásd a SpinLock és a SpinWait oldalakat. A ConcurrentQueue<T> és ConcurrentStack<T> osztályok egyáltalán nem használnak zárolásokat. Ehelyett a szál biztonsága érdekében összekapcsolt műveletekre támaszkodnak.

illusztrál

Mivel az egyidejű gyűjteményosztályok támogatják az ICollectiont, megvalósítást biztosítanak az IsSynchronized és SyncRoot tulajdonságokhoz, még akkor is, ha ezek nem kapcsolódnak egymáshoz. Az IsSynchronized mindig hamisat ad vissza, míg a SyncRoot mindig null (Semmi a Visual Basic-ben).

Az alábbi táblázat a System.Collections.Concurrent névtérben található gyűjteménytípusokat sorolja fel.



típus
leírás
BlockingCollection<T>
<T> Bármilyen típusú korlátozást és blokkolást biztosít az IProducerConsumerCollection megvalósításához. További információért lásd: BlockingCollection áttekintés.
ConcurrentDictionary<TKey, TValue>
A kulcs/érték a szótár szál-biztonságos megvalósítása.
ConcurrentQueue<T>
FIFO (first be, first out) sorok szálbiztonsági megvalósítása.
ConcurrentStack<T>
Szálbiztonságú megvalósítás a LIFO (last-in, first-out) veremekhez.
ConcurrentBag<T>
Egy sorrendben kívüli elemgyűjtemény szál-biztonságos megvalósítása.
IProducerConsumerCollection<T>
A típusokat meg kell valósítaniBlockingCollectiona







Előző:.net/c# itextsharp PDF kód generálásához
Következő:Install-Package: "MvvmLightLibs" már van egy függőség a "CommonServiceLocator" számára...
Közzétéve 2017. 11. 08. 15:24:45 |
Igen, megtanultam
 Háziúr| Közzétéve 2021. 02. 08. 10:00:41 |
A lista<T> szálbiztonságú, ha a listát egyáltalán nem módosítják az iteráció során.
 Háziúr| Közzétéve 2021. 03. 23. 11:32:46 |
A ConcurrentDictionary támogatja az új és frissített frissítéseket
https://www.itsvse.com/thread-2955-1-1.html

 Háziúr| Közzétéve 2023. 06. 24. 14:20:57 |
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com