SRW-Sperren (Slim Reader/Writer)

SrW-Sperren (Slim Reader/Writer) ermöglichen es den Threads eines einzelnen Prozesses, auf freigegebene Ressourcen zuzugreifen. sie sind auf Geschwindigkeit optimiert und belegen nur sehr wenig Arbeitsspeicher. Schlanke Reader-Writer-Sperren können nicht prozessübergreifend freigegeben werden.

Leserthreads lesen Daten aus einer freigegebenen Ressource, während Writerthreads Daten in eine freigegebene Ressource schreiben. Wenn mehrere Threads mit einer freigegebenen Ressource lesen und schreiben, können exklusive Sperren wie ein kritischer Abschnitt oder Mutex zu einem Engpass werden, wenn die Lesethreads kontinuierlich ausgeführt werden, Schreibvorgänge jedoch selten sind.

SRW-Sperren bieten zwei Modi, in denen Threads auf eine freigegebene Ressource zugreifen können:

  • Der freigegebene Modus gewährt freigegebenen schreibgeschützten Zugriff auf mehrere Leserthreads, wodurch daten gleichzeitig aus der freigegebenen Ressource gelesen werden können. Wenn Lesevorgänge Schreibvorgänge überschreiten, erhöht diese Parallelität die Leistung und den Durchsatz im Vergleich zu kritischen Abschnitten.

    Hinweis

    SRW-Sperren im gemeinsamen Modus sollten nicht rekursiv abgerufen werden, da dies in Kombination mit dem exklusiven Erwerb zu Deadlocks führen kann.

  • Exklusiver Modus, der Lese-/Schreibzugriff auf jeweils einen Writerthread gewährt. Wenn die Sperre im exklusiven Modus abgerufen wurde, kann kein anderer Thread auf die freigegebene Ressource zugreifen, bis der Writer die Sperre freigibt.

    Hinweis

    SRW-Sperren im exklusiven Modus können nicht rekursiv abgerufen werden. Wenn ein Thread versucht, eine Sperre abzurufen, die bereits vorhanden ist, schlägt dieser Versuch fehl (für TryAcquireSRWLockExclusive) oder deadlock (für AcquireSRWLockExclusive).

Eine einzelne SRW-Sperre kann in beiden Modi abgerufen werden. Leserthreads können sie im freigegebenen Modus abrufen, während Writerthreads sie im exklusiven Modus abrufen können. Es gibt keine Garantie für die Reihenfolge, in der Threads, die den Besitz anfordern, besitzberechtigt wird. SRW-Sperren sind weder fair noch FIFO.

Eine SRW-Sperre ist die Größe eines Zeigers. Der Vorteil besteht darin, dass der Sperrzustand schnell aktualisiert werden kann. Der Nachteil ist, dass sehr wenig Zustandsinformationen gespeichert werden können, sodass SRW-Sperren keine falsche rekursive Verwendung im freigegebenen Modus erkennen. Darüber hinaus kann ein Thread, der eine SRW-Sperre im freigegebenen Modus besitzt, seinen Besitz der Sperre nicht auf den exklusiven Modus aktualisieren.

Der Aufrufer muss eine SRWLOCK-Struktur zuordnen und initialisieren, indem entweder InitializeSRWLock aufgerufen wird (um die Struktur dynamisch zu initialisieren) oder die Konstante SRWLOCK_INIT der Strukturvariablen zuweisen (um die Struktur statisch zu initialisieren).

Sie können application verifier verwenden, um die rekursive (reentrant) Verwendung von SRW-Sperren zu finden.

Im Folgenden sind die SRW-Sperrfunktionen aufgeführt.

SRW-Sperrfunktion BESCHREIBUNG
AcquireSRWLockExclusive Ruft eine SRW-Sperre im exklusiven Modus ab.
AcquireSRWLockShared Ruft eine SRW-Sperre im freigegebenen Modus ab.
InitializeSRWLock Initialisieren Sie eine SRW-Sperre.
ReleaseSRWLockExclusive Gibt eine SRW-Sperre frei, die im exklusiven Modus geöffnet wurde.
ReleaseSRWLockShared Gibt eine SRW-Sperre frei, die im freigegebenen Modus geöffnet wurde.
SleepConditionVariableSRW Schläft für die angegebene Bedingungsvariable und gibt die angegebene Sperre als atomischen Vorgang frei.
TryAcquireSRWLockExclusive Versucht, eine SRW-Sperre (Slim Reader/Writer) im exklusiven Modus zu erhalten. Wenn der Aufruf erfolgreich ist, übernimmt der aufrufende Thread die Sperre.
TryAcquireSRWLockShared Versucht, eine SRW-Sperre (Slim Reader/Writer) im freigegebenen Modus zu erhalten. Wenn der Aufruf erfolgreich ist, übernimmt der aufrufende Thread die Sperre.