Lese-/Schreiberspinlocks

Ab Windows Vista mit Service Pack 1 (SP1) verwenden eine Reihe verwandter Routinen Drehsperren, um synchronisierten Zugriff auf Datenstrukturen zu unterstützen, die von Lesern und Autoren gemeinsam genutzt werden. Ein Thread, der nur Lesezugriff auf eine Datenstruktur erfordert, kann eine Drehsperre verwenden, um diese Struktur für andere Lesethreads freizugeben. Ein Thread, der in eine gemeinsame Datenstruktur schreiben muss, muss den Spinlock verwenden, um exklusiven Zugriff auf die Datenstruktur zu erhalten, bevor er in diese Struktur schreiben kann.

Wenn ein Lesethread eine Spin-Lock für gemeinsamen Zugriff abrufen muss und die Sperre bereits für exklusiven Zugriff durch einen Schreib-Thread gehalten wird, muss der Leser zuerst warten, bis der Schreib-Thread die Sperre freigibt. Wenn ein Writer-Thread einen Spinlock für exklusiven Zugriff erwerben muss und der Lock bereits für geteilten Zugriff von einem oder mehreren Lesethreads gehalten wird, muss der Writer-Thread warten, bis alle diese Lesethreads den Lock freigeben. Während der Schreiber wartet, können keine neuen Leser-Threads die Sperre erwerben. Stattdessen muss ein Leser, der die Sperre benötigt, auf die der Schreiber wartet, zuerst darauf warten, dass der Schreiber die Sperre erwirbt und freigibt.

Ein Thread kann die Rollen zwischen Leser und Autor wechseln. Ein Thread, der bereits einen Spinlock für geteilten Zugriff hält, kann versuchen, den Zugriffsmodus des Spinlocks vom geteilten in den exklusiven Modus zu ändern. Dieser Versuch ist erfolgreich, wenn keine Leser bereits die Spinlock für gemeinsamen Zugriff halten und wenn kein Schreiber bereits darauf wartet, die Spinlock für exklusiven Zugriff zu erlangen.

Rekursives Erwerben einer Drehsperre bewirkt deadlock und ist nicht zulässig.

Im Folgenden finden Sie eine Liste der Routinen, die ab Windows Vista SP1 zum Verwalten von Reader-Writer-Spinlocks verfügbar sind.

Routinename BESCHREIBUNG
ExAcquireSpinLockExclusive Erwirbt eine Spinlock für den exklusiven Zugriff durch den Aufrufer und erhöht das IRQL auf DISPATCH_LEVEL.
ExAcquireSpinLockExclusiveAtDpcLevel Ruft eine Drehsperre für exklusiven Zugriff durch einen Aufrufer ab, der bereits unter IRQL >= DISPATCH_LEVEL ausgeführt wird.
ExAcquireSpinLockShared Erwirbt eine Spinlock für den freigegebenen Zugriff durch den Aufrufer und erhöht die IRQL auf DISPATCH_LEVEL.
ExAcquireSpinLockSharedAtDpcLevel Erwirbt einen Spinlock für den geteilten Zugriff von einem Aufrufer, der bereits unter IRQL >= DISPATCH_LEVEL ausgeführt wird.
ExReleaseSpinLockExclusive Gibt einen Spinlock frei, den der Aufrufer für einen exklusiven Zugriff erworben hat und stellt die ursprüngliche IRQL wieder her.
ExReleaseSpinLockExclusiveFromDpcLevel Gibt einen Spinlock frei, den der Aufrufer für exklusiven Zugriff erlangt hat, und verringert nicht die IRQL.
ExReleaseSpinLockShared Gibt einen Spinlock frei, den der Aufrufer für gemeinsamen Zugriff erworben hat, und stellt die ursprüngliche IRQL wieder her.
ExReleaseSpinLockSharedFromDpcLevel Gibt einen Spinlock frei, den der Aufrufer für gemeinsam genutzten Zugriff erworben hat, und verringert nicht die IRQL.
ExTryConvertSharedSpinLockExclusive Versucht, den Zugriffsstatus einer Drehsperre umzuwandeln, die der Aufrufer bereits für den gemeinsamen Zugriff besitzt, in exklusiven Zugriff.

Die Reader/Writer-Spinlock-Routinen erhalten als ersten Parameter einen Zeiger auf ein Spinlock, das eine EX_SPIN_LOCK-Struktur ist. Diese Struktur ist für Treiber nicht transparent. Ein Treiber sollte den Speicher für die Drehungssperre aus dem nicht ausgelagerten Systemspeicher zuordnen und die Sperre auf Null initialisieren.