Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 18751|Svar: 0

[Tips] C# Läs/skriv lås ReaderWriterLockSlim-användning

[Kopiera länk]
Publicerad på 2017-03-09 16:59:19 | | | |
Konceptet med läs-skriv-lås är enkelt, det tillåter flera trådar att skaffa läslås samtidigt, men endast en tråd får få skrivlås samtidigt, så det kallas också delade-exklusiva lås. I C# rekommenderas att använda klassen ReaderWriterLockSlim för att slutföra läs-/skriv-låsfunktionen.
I vissa fall är antalet läsningar till ett objekt mycket större än antalet ändringar, och om det helt enkelt låses genom låsning påverkar det läseffektiviteten. Om ett läs-skriv-lås används kan flera trådar läsa objektet samtidigt, och det blockeras bara när objektet är upptaget av skriv-låset.
Enkelt uttryckt, när en tråd går in i läsläge kan andra trådar fortfarande gå in i läsläge, förutsatt att en tråd vill gå in i skrivläge just nu, måste den blockeras. tills läsläget avslutas.
På samma sätt, om en tråd går in i skrivläge, kommer de andra trådarna att blockeras oavsett om de vill skriva eller läsa.
Det finns två sätt att gå in i skriv-/läsläge:
EnterReadLock försöker gå in i skrivlägeslåsläget.
TryEnterReadLock(Int32) försöker gå in i läslägeslåset, med möjlighet att välja en heltalstimeout.
EnterWriteLock försöker gå in i Write Mode Lock-tillståndet.
TryEnterWriteLock(Int32) försöker gå in i skrivlägeslåstillståndet, och timeout-tiden kan väljas.
Det finns två sätt att avsluta skriv-/läsläget:
ExitReadLock minskar den rekursiva räkningen i läsläget och lämnar läsläget när det resulterande antalet är 0 (noll).
ExitWriteLock minskar den rekursiva räkningen av skrivmönstret och lämnar skrivläget när det resulterande antalet är 0 (noll).
Så här använder du det:



Du kan se att tråd 3 och tråd 4 kan gå in i läsläge samtidigt, medan tråd 5 kan gå in i skrivläge efter 5 sekunder (det vill säga efter att tråd 3 och 4 har lämnat läslåset).
Modifiera ovanstående kod, öppna först 2 trådar i skrivläge och sedan öppna trådar i läsläge, koden är följande:
      


Resultaten är följande:

Som du kan se går både tråd 3 och tråd 4 in i skrivläge, men tråd 3 tar skrivlåset först, så tråd 4 måste vänta 10 sekunder innan den går in. Trådar 5 och 6 måste ockupera läslåset, så vänta tills tråd 4 lämnar skrivlåset innan du fortsätter.
TryEnterReadLock och TryEnterWriteLock kan sätta en timeout, när man kör till denna mening kommer tråden att blockera här, om låset kan upptas vid denna tidpunkt, sedan returnera true, om timeout-tiden ännu inte har upptagit låset, sedan returnera false false och ge upp ockupationen av låset och fortsätta exekvera följande kod direkt.
EnterUpgradeBarReadLock
ReaderWriterLockSlim-klassen erbjuder ett uppgraderbart läsläge, som skiljer sig från läsläge genom att det också kan uppgraderas till skrivläge genom att anropa metoderna EnterWriteLock eller TryEnterWriteLock. För att bara en tråd kan vara i uppgraderingsbart läge åt gången. En tråd som går in i uppgraderingsbart läge påverkar inte tråden i läsläge, det vill säga, när en tråd går in i uppgraderingsläge kan valfritt antal trådar gå in i läsläge samtidigt utan blockering. Om flera trådar redan väntar på att få ett skrivlås, kommer körning av EnterUpgradeableReadLock att blockera tills trådarna går ut eller lämnar skrivlåset.
Följande kod visar hur man uppgraderar till ett skrivlås i uppgraderbart läsläge.



Effekten av läs-/skrivlås på prestandan är uppenbar.
Följande testkod:


Ovanstående kod simulerar driften av 500 Tasks, var och en upptar en trådpooltråd, varav 20 är skrivtrådar och 480 lästrådar simuleras. Det tar 10 ms att läsa data och 100 ms att skriva för att testa låsmetoden respektive ReaderWriterLockSlim-metoden. En uppskattning kan göras för ReaderWriterLockSlim, med antagandet att 480 trådar läses samtidigt, då förbrukar det 10 ms, 20 skrivoperationer upptar 2000 ms, så tiden som tas är 2010 ms, och för den vanliga låsmetoden, eftersom de alla är exklusiva, så 480 läsoperationer upptar 4800 ms + 20 skrivoperationer 2000 ms = 6800 ms. Resultaten visade en märkbar prestandaförbättring.






Föregående:Visual Studio 2017 offline-installationspaket 18GB Baidu molnnedladdning
Nästa:De senaste sårbarheterna och attackmetoderna i Struts2 versioner 2.2 och 2.3
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com