Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 18751|Svar: 0

[Tips] C# Read/Write Lock ReaderWriterLockSlim brug

[Kopier link]
Opslået på 09/03/2017 16.59.19 | | | |
Konceptet med læse-skrive-låse er simpelt og tillader flere tråde at opnå læse-låse samtidig, men kun én tråd må opnå skrive-låse samtidig, så det kaldes også delte-eksklusive låse. I C# anbefales det at bruge ReaderWriterLockSlim-klassen til at fuldføre læse-/skrive-låsefunktionen.
I nogle tilfælde er antallet af læsninger til et objekt meget større end antallet af ændringer, og hvis det blot låses ved at låse, vil det påvirke læseeffektiviteten. Hvis en læse-skrive-lås bruges, kan flere tråde læse objektet samtidig, og det vil kun blive blokeret, når objektet er optaget af skrive-låsen.
Kort sagt, når en tråd går i læsetilstand, kan andre tråde stadig gå i læsetilstand, forudsat at en tråd ønsker at gå i skrivetilstand på dette tidspunkt, og så skal den blokeres. indtil læsetilstand lukkes.
Tilsvarende, hvis en tråd går i skrivetilstand, vil de andre tråde blive blokeret, uanset om de vil skrive eller læse.
Der er to måder at gå ind i skrive-/læse-tilstand på:
EnterReadLock forsøger at gå ind i skrivetilstandens låsetilstand.
TryEnterReadLock(Int32) forsøger at gå ind i læsetilstandslåsetilstanden med mulighed for at vælge en heltals-timeout.
EnterWriteLock forsøger at gå ind i Write Mode Lock-tilstanden.
TryEnterWriteLock(Int32) forsøger at gå ind i skrivetilstandens låsetilstand, og timeout-tiden kan vælges.
Der er to måder at forlade skrive-/læsetilstand på:
ExitReadLock reducerer den rekursive tælling i læsetilstanden og forlader læsetilstanden, når den resulterende tælling er 0 (nul).
ExitWriteLock reducerer den rekursive tælling af skrivemønsteret og forlader skrivetilstanden, når det resulterende antal er 0 (nul).
Sådan bruger du det:



Du kan se, at tråd 3 og tråd 4 kan gå i læsetilstand samtidig, mens tråd 5 kan gå i skrivetilstand efter 5 sekunder (altså efter tråd 3 og 4 er kommet ud af læselåsen).
Modificerer ovenstående kode, åbn først 2 tråde i skrivetilstand, og derefter åbn tråde i læsetilstand, koden er som følger:
      


Resultaterne er som følger:

Som du kan se, går tråd 3 og tråd 4 begge i skrivemode, men tråd 3 besætter skrivelåsen først, så tråd 4 må vente 10 sekunder, før den går ind. Tråde 5 og 6 skal besætte læselåsen, så vent på, at tråd 4 forlader skrivelåsen, før du fortsætter.
TryEnterReadLock og TryEnterWriteLock kan sætte en timeout; når tråden kører til denne sætning, vil tråden blokere her, hvis låsen kan besættes på dette tidspunkt, derefter returnere true, hvis timeout-tiden endnu ikke har optaget låsen, derefter returnere false (false), opgive besættelsen af låsen og fortsætte med at udføre følgende kode direkte.
Træd indOpgraderbarLæsLås
ReaderWriterLockSlim-klassen tilbyder en opgraderbar læsetilstand, som adskiller sig fra læsetilstand ved, at den også kan opgraderes til skrivetilstand ved at kalde metoderne EnterWriteLock eller TryEnterWriteLock. Fordi kun én tråd kan være i opgraderbar tilstand ad gangen. En tråd, der går i opgraderbar tilstand, vil ikke påvirke tråden i læsetilstand, det vil sige, at når en tråd går i opgraderbar tilstand, kan et vilkårligt antal tråde gå i læsetilstand samtidig uden blokering. Hvis flere tråde allerede venter på at opnå en skrivelås, vil kørsel af EnterUpgradeableReadLock blokere, indtil trådene går ud eller forlader skrivelåsen.
Følgende kode viser, hvordan man opgraderer til en skrivelås i opgraderbar læsetilstand.



Effekten af læse-/skrivelåse på ydeevnen er tydelig.
Følgende testkode:


Ovenstående kode simulerer driften af 500 Tasks, som hver optager en trådpooltråd, hvoraf 20 er skrivetråde og 480 læsetråde simuleres. Det tager 10 ms at læse data og 100 ms at skrive for at teste låsemetoden og ReaderWriterLockSlim-metoden henholdsvis. Et estimat kan laves for ReaderWriterLockSlim, hvor man antager, at 480 tråde læser samtidig, derefter bruger det 10 ms, 20 skriveoperationer optager 2000 ms, så den tid, der bruges, er 2010 ms, og for den almindelige låsemetode, fordi de alle er eksklusive, så 480 læseoperationer optager 4800 ms + 20 skriveoperationer 2000 ms = 6800 ms. Resultaterne viste en mærkbar forbedring i ydeevnen.






Tidligere:Visual Studio 2017 offline installationspakke 18GB Baidu cloud download
Næste:De nyeste sårbarheder og angrebsmetoder i Struts2 versioner 2.2 og 2.3
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com