Slim Reader/Writer (SRW)-vergrendelingen
Met SW-vergrendelingen (Slim Reader/Writer) kunnen de threads van één proces toegang krijgen tot gedeelde resources; ze zijn geoptimaliseerd voor snelheid en bezetten zeer weinig geheugen. Slim reader-writer-vergrendelingen kunnen niet worden gedeeld tussen processen.
Lezerthreads lezen gegevens uit een gedeelde resource, terwijl schrijfthreads gegevens naar een gedeelde resource schrijven. Wanneer meerdere threads worden gelezen en geschreven met behulp van een gedeelde resource, kunnen exclusieve vergrendelingen, zoals een kritieke sectie of mutex, een knelpunt worden als de lezerthreads continu worden uitgevoerd, maar schrijfbewerkingen zeldzaam zijn.
SRW-vergrendelingen bieden twee modi waarin threads toegang hebben tot een gedeelde resource:
gedeelde modus, waarmee gedeelde alleen-lezentoegang wordt verleend tot meerdere lezerthreads, zodat ze gegevens uit de gedeelde resource gelijktijdig kunnen lezen. Als leesbewerkingen schrijfbewerkingen overschrijden, verhoogt deze gelijktijdigheid de prestaties en doorvoer in vergelijking met kritieke secties.
Notitie
SRW-vergrendelingen in de gedeelde modus mogen niet recursief worden verkregen, omdat dit kan leiden tot impasses in combinatie met exclusieve overname.
exclusieve modus, waarmee lees-/schrijftoegang wordt verleend aan één schrijfthread tegelijk. Wanneer de vergrendeling is verkregen in de exclusieve modus, heeft geen andere thread toegang tot de gedeelde resource totdat de schrijver de vergrendeling vrijgeeft.
Notitie
Exclusieve modus SRW-vergrendelingen kunnen niet recursief worden verkregen. Als een thread probeert een vergrendeling te verkrijgen die al is opgeslagen, mislukt die poging (voor TryAcquireSRWLockExclusive) of impasse (voor AcquireSRWLockExclusive)
Eén SRW-vergrendeling kan worden verkregen in beide modus; lezerthreads kunnen deze verkrijgen in de gedeelde modus, terwijl schrijfthreads deze in exclusieve modus kunnen verkrijgen. Er is geen garantie over de volgorde waarin threads die eigendom aanvragen, eigendom krijgen; SRW sloten zijn niet eerlijk of FIFO.
Een SRW-vergrendeling is de grootte van een aanwijzer. Het voordeel is dat het snel is om de vergrendelingsstatus bij te werken. Het nadeel is dat zeer weinig statusinformatie kan worden opgeslagen, dus SRW-vergrendelingen detecteren geen onjuist recursief gebruik in de gedeelde modus. Bovendien kan een thread die eigenaar is van een SRW-vergrendeling in de gedeelde modus, het eigendom van de vergrendeling niet upgraden naar de exclusieve modus.
De aanroeper moet een SRWLOCK-structuur toewijzen en initialiseren door InitializeSRWLock aan te roepen (om de structuur dynamisch te initialiseren) of de constante SRWLOCK_INIT toe te wijzen aan de structuurvariabele (om de structuur statisch te initialiseren).
U kunt Application Verifier- gebruiken om recursief (reentrant) gebruik van SRW-vergrendelingen te vinden.
Hier volgen de SRW-vergrendelingsfuncties.
SRW-vergrendelingsfunctie | Beschrijving |
---|---|
AcquireSRWLockExclusive | Hiermee verkrijgt u een SRW-vergrendeling in de exclusieve modus. |
AcquireSRWLockShared | Hiermee verkrijgt u een SRW-vergrendeling in de gedeelde modus. |
InitializeSRWLock | Initialiseer een SRW-vergrendeling. |
ReleaseSRWLockExclusive- | Hiermee wordt een SRW-vergrendeling uitgebracht die is geopend in de exclusieve modus. |
ReleaseSRWLockShared- | Hiermee wordt een SRW-vergrendeling uitgebracht die is geopend in de gedeelde modus. |
SleepConditionVariableSRW- | Slaapstanden op de opgegeven voorwaardevariabele en geeft de opgegeven vergrendeling vrij als een atomische bewerking. |
TryAcquireSRWLockExclusive | Pogingen om een slanke lezer/schrijver (SRW)-vergrendeling te verkrijgen in de exclusieve modus. Als de aanroep is geslaagd, heeft de aanroepende thread het eigendom van de vergrendeling. |
TryAcquireSRWLockShared | Pogingen om een slanke lezer/schrijververgrendeling (SRW) te verkrijgen in de gedeelde modus. Als de aanroep is geslaagd, heeft de aanroepende thread het eigendom van de vergrendeling. |