Freigeben über


Slim Reader/Writer (SRW)-Sperren

Slim reader/writer (SRW)-Sperren ermöglichen den Threads eines einzelnen Prozesses den Zugriff auf freigegebene Ressourcen; sie sind für Geschwindigkeit optimiert und belegen sehr wenig Arbeitsspeicher. Schlanke Lese-Writer-Sperren können nicht über Prozesse hinweg freigegeben werden.

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

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

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

    Anmerkung

    SRW-Sperren für den gemeinsam genutzten Modus sollten nicht rekursiv erworben werden, da dies zu Deadlocks führen kann, wenn sie mit exklusivem Erwerb kombiniert werden.

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

    Anmerkung

    SrW-Sperrungen im Exklusivmodus können nicht rekursiv abgerufen werden. Wenn ein Thread versucht, eine bereits enthälte Sperre abzurufen, schlägt dieser Versuch fehl (für TryAcquireSRWLockExclusive) oder Deadlock (für AcquireSRWLockExclusive)

Eine einzelne SRW-Sperre kann in beiden Modus erworben werden; Lesethreads können sie im gemeinsam genutzten Modus erwerben, während Writer-Threads sie im exklusiven Modus erwerben können. Es gibt keine Garantie für die Reihenfolge, in der Threads, die Besitz anfordern, Besitz gewährt werden; SRW-Sperren sind weder fair noch FIFO.

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

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

Sie können Application Verifier- verwenden, um rekursive (reentrant) Verwendung von SRW-Sperren zu finden.

Nachfolgend sind die SRW-Sperrfunktionen aufgeführt.

SRW-Sperrfunktion Beschreibung
AcquireSRWLockExclusive Erwirbt eine SRW-Sperre im exklusiven Modus.
AcquireSRWLockShared Erwirbt eine SRW-Sperre im gemeinsam genutzten Modus.
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 auf der angegebenen Bedingungsvariable und gibt die angegebene Sperre als atome Operation frei.
TryAcquireSRWLockExclusive Versucht, eine schlanke Lese-/Schreibzugriffssperre (SRW) im exklusiven Modus zu erwerben. Wenn der Aufruf erfolgreich ist, übernimmt der aufrufende Thread den Besitz der Sperre.
TryAcquireSRWLockShared Versucht, eine schlanke Lese-/Schreibzugriffssperre (SRW) im gemeinsam genutzten Modus zu erwerben. Wenn der Aufruf erfolgreich ist, übernimmt der aufrufende Thread den Besitz der Sperre.