Dela via


SRW-lås (Slim Reader/Writer)

Med SRW-lås (Slim Reader/Writer) kan trådarna i en enda process komma åt delade resurser. de är optimerade för hastighet och upptar mycket lite minne. Smala lås för läsare och skrivare kan inte delas mellan processer.

Läsartrådar läser data från en delad resurs medan skrivtrådar skriver data till en delad resurs. När flera trådar läser och skriver med en delad resurs kan exklusiva lås som ett kritiskt avsnitt eller mutex bli en flaskhals om läsartrådarna körs kontinuerligt men skrivåtgärder är sällsynta.

SRW-lås ger två lägen där trådar kan komma åt en delad resurs:

  • Delat läge, som ger delad skrivskyddad åtkomst till flera läsartrådar, vilket gör att de kan läsa data från den delade resursen samtidigt. Om läsåtgärder överskrider skrivåtgärder ökar den här samtidigheten prestanda och dataflöde jämfört med kritiska avsnitt.

    Not

    SRW-lås i delat läge bör inte förvärvas rekursivt eftersom detta kan leda till dödlägen i kombination med exklusivt förvärv.

  • Exklusivt läge, som ger läs-/skrivåtkomst till en skrivtråd i taget. När låset har hämtats i exklusivt läge kan ingen annan tråd komma åt den delade resursen förrän skrivaren släpper låset.

    Not

    SRW-lås i exklusivt läge kan inte hämtas rekursivt. Om en tråd försöker hämta ett lås som den redan innehåller misslyckas det försöket (för TryAcquireSRWLockExclusive) eller dödläge (för AcquireSRWLockExclusive)

Ett enda SRW-lås kan hämtas i båda lägena. läsartrådar kan hämta den i delat läge medan skrivtrådar kan hämta den i exklusivt läge. Det finns ingen garanti för i vilken ordning trådar som begär ägarskap beviljas ägarskap. SRW-lås är varken rättvisa eller FIFO.

Ett SRW-lås är storleken på en pekare. Fördelen är att det går snabbt att uppdatera låstillståndet. Nackdelen är att mycket lite tillståndsinformation kan lagras, så SRW-lås identifierar inte felaktig rekursiv användning i delat läge. Dessutom kan en tråd som äger ett SRW-lås i delat läge inte uppgradera ägarskapet för låset till exklusivt läge.

Anroparen måste allokera en SRWLOCK-struktur och initiera den genom att antingen anropa InitializeSRWLock (för att initiera strukturen dynamiskt) eller tilldela konstanten SRWLOCK_INIT till strukturvariabeln (för att initiera strukturen statiskt).

Du kan använda programverifierare för att hitta rekursiv (reentrant) användning av SRW-lås.

Följande är SRW-låsfunktionerna.

SRW-låsfunktion Beskrivning
AcquireSRWLockExclusive Hämtar ett SRW-lås i exklusivt läge.
AcquireSRWLockShared Hämtar ett SRW-lås i delat läge.
InitieraRWLock- Initiera ett SRW-lås.
ReleaseSRWLockExclusive Släpper ett SRW-lås som öppnades i exklusivt läge.
ReleaseSRWLockShared Släpper ett SRW-lås som öppnades i delat läge.
SleepConditionVariableSRW Viloläge för den angivna villkorsvariabeln och frigör det angivna låset som en atomisk åtgärd.
TryAcquireSRWLockExclusive Försöker skaffa ett SRW-lås (Slim Reader/Writer) i exklusivt läge. Om anropet lyckas tar den anropande tråden över ägarskapet för låset.
TryAcquireSRWLockShared Försöker hämta ett SRW-lås (Slim Reader/Writer) i delat läge. Om anropet lyckas tar den anropande tråden över ägarskapet för låset.