Normál körülmények között, amíg többszálas programozásról van szó, a program összetettsége jelentősen nő, a teljesítmény jelentősen csökken, és a hibák valószínűsége jelentősen nő.
A többszálas programozás célja, hogy párhuzamosan futtassák a programot az adatfeldolgozási képességek javítása érdekében, de a legtöbb esetben versengés van a megosztott erőforrásokért, ezért az erőforrás-objektumok módosításakor zárolni kell. Ugyanakkor sokféleképpen lehet a zárokat megvalósítani, ezért nézzük meg a C#-ban több típusú zár megvalósítását és teljesítményét.
Több módja a zárak használatának
1. Atomzár
Elérni a "zár nélküli" versenyt az Interlocked atomművelet révén. ÖsszehasonlításCsere.
A hivatalos magyarázat az, hogy több szál által megosztott változók atomi műveleteit kell biztosítani. Névtér: System.Threading
2. Kritikus terület
Több szál sorozatosítása a nyilvános erőforrásokhoz vagy egy kódhoz való hozzáféréshez gyors és alkalmas az adathozzáférés szabályozására. A C# zár szintaxisa a kritikus terület (Monitor) szintaxisa sugara.
3. Atomműködés
Az atomi műveletek, amelyek különleges esetek, eleve szálbiztonságúak, így nincs szükség zárásra.
Hivatalosan úgy értelmezik, hogy egy adott változó értékét atomi művelet formájában növelik, és az eredményt tárolják. Névtér: System.Threading
4. Olvasd és írd a zárat
Az olvasás-írási zárak lehetővé teszik az erőforrások olvasását, amikor más programok írnak, így ha az erőforrás piszkos olvasásokat engedélyez, ez a megfelelőbb.
A hivatalos magyarázat egy zárolt állapotot jelöl, amelyet az erőforrás-hozzáférés kezelésére használnak, lehetővé téve a többszálas olvasást vagy exkluzív írási hozzáférést. A névtér a System.Threading
5. Szemafór
Szemafórek, amelyeket korlátozott számú felhasználói erőforrás vezérlésére terveztek.
A hivatalos magyarázat korlátozza, hogy hány szál férhet hozzá egyszerre egy erőforráshoz vagy erőforrás-poolhoz. A névtér a System.Threading
6. Események
Arra szolgál, hogy értesítse a szálat, ha események történtek, elindítva egy utódfeladat kezdetét.
A hivatalos magyarázat szerint a szálszinkronizációs események automatikusan visszaállnak, amikor egy jelet kapnak a szál kiszabadítása után. Az ilyen típusok nem öröklődhetnek.
7. Kölcsönös kizárás
Van egy Mutex osztály C#-ban, közvetlenül a System.Threading névtér alatt, a Mutex valójában mutex, amely nemcsak több szál közötti erőforrás-versenyt képes kezelni, hanem a folyamatok közötti erőforrás-versenyt is.
Teljesítményteszt kód
Futtatd a kódot
Teljesítményteszt eredmények
Megjegyzés: A fenti adatok csak a jelenlegi tesztkörnyezet hardverteljesítményének eredményei, és csak egymással lehet összehasonlítani.
1) Különböző teszteken ez a leggyorsabb, ha nem zárol, ezért próbáld elkerülni az erőforrás-versengést, ami zárt működéshez vezet.
2) Interlocked.CompareExchange következetesen kiváló teljesítményt mutat a többszálas kezelésben, a második helyen.
3) A harmadik zár, a kritikus zóna is jó teljesítményt mutat, ezért kérlek, cáfolj másokat, ha azt mondják, hogy a zár teljesítménye alacsony.
4) A negyedik hely az atomi változó (atomi) művelet, de jelenleg csak a változók önnövelését és kivonását támogatja, és az alkalmazhatóság nem erős.
5) Az ötödik olvasási/írási zár (ReaderWriterLockSlim) teljesítménye is rendben van, támogatja a semmi olvasását, és a gyakorlati minősége továbbra is viszonylag jó.
6) A megmaradt szemaforok, események és mutex a legrosszabb teljesítményűek, természetesen megvan a saját alkalmazási területük, de nem teljesítenek jól az erőforrás-versengésben.
Eredeti linkcím:A hiperlink bejelentkezés látható.
|