Einführung in ERESOURCE-Routinen
Das System bietet Routinen zum Abrufen und Freigeben von ERESOURCE-Strukturen sowie zum Untersuchen des aktuellen Zustands.
Abrufen und Freigeben einer ERESOURCE-Struktur
Treiber können die ERESOURCE-Strukturen verwenden, um eine exklusive/freigegebene Synchronisierung zu implementieren. Die exklusive/freigegebene Synchronisierung funktioniert wie folgt:
Eine beliebige Anzahl von Threads kann eine ERESOURCE als freigegeben abrufen.
Nur ein Thread kann eine ERESOURCE exklusiv abrufen. Die ERESOURCE kann nur exklusiv abgerufen werden, wenn keine Threads sie bereits als freigegeben erworben haben.
Ein Thread, der derzeit keine ERESOURCE abrufen kann, kann optional in einen Wartezustand versetzt werden, bis die ERESOURCE abgerufen werden kann. Das System verwaltet zwei Listen von Threads, die auf eine ERESOURCE warten: eine Liste exklusiver Kellner und eine Liste von freigegebenen Kellnern.
Eine typische Verwendung für die exklusive/freigegebene Synchronisierung ist die Implementierung einer Lese-/Schreibsperre. Eine Lese-/Schreibsperre ermöglicht es mehreren Threads, einen Lesevorgang auszuführen, aber nur ein Thread kann gleichzeitig schreiben. Dies kann direkt im Hinblick auf den Erwerb einer ERESOURCE implementiert werden.
Ein Treiber ordnet den Speicher für eine ERESOURCE zu und initialisiert ihn mit ExInitializeResourceLite. Das System verwaltet eine Liste aller verwendeten ERESOURCE-Strukturen. Wenn der Treiber keine bestimmte ERESOURCE mehr benötigt, muss er ExDeleteResourceLite aufrufen, um ihn aus der Liste des Systems zu löschen. Der Treiber kann auch eine ERESOURCE wiederverwenden, indem ExReinitializeResourceLite aufgerufen wird.
Treiber können die folgenden grundlegenden Vorgänge für eine ERESOURCE ausführen:
Rufen Sie eine ERESOURCE als freigegeben mit ExAcquireResourceSharedLite ab. Diese Routine ruft die Ressource nur ab, wenn die Ressource nicht exklusiv abgerufen wurde und keine exklusiven Kellner vorhanden sind.
Erwerben Sie eine ERESOURCE exklusiv mit ExAcquireResourceExclusiveLite. Diese Routine ruft die Ressource ab, solange sie nicht exklusiv oder als freigegeben erworben wurde.
Konvertieren Sie eine exklusive Übernahme in eine gemeinsame Übernahme mit ExConvertExclusiveToSharedLite.
Geben Sie eine erworbene Ressource mit ExReleaseResourceLite frei.
Der Wait-Parameter von ExAcquireResourceSharedLite und ExAcquireResourceExclusiveLite bestimmt, ob der aktuelle Thread auf das Abrufen der ERESOURCE wartet. Wenn Sie den Wert FALSE angeben und die ERESOURCE nicht abgerufen werden kann, gibt die Routine FALSE zurück. Wenn Sie den Wert TRUE angeben, wird der aktuelle Thread in die entsprechende Warteliste für die ERESOURCE eingefügt.
Untersuchen des Zustands einer ERESOURCE-Struktur
Ein Treiber kann auch den aktuellen Zustand einer ERESOURCE wie folgt bestimmen:
Verwenden Sie ExIsResourceAcquiredLite oder ExIsResourceAcquiredSharedLite , um zu ermitteln, ob die ERESOURCE bereits als freigegeben oder exklusiv erworben wurde. Verwenden Sie ExIsResourceAcquiredExclusiveLite , um zu überprüfen, ob die ERESOURCE exklusiv erworben wurde.
Verwenden Sie ExGetSharedWaiterCount , um die Anzahl der freigegebenen Kellner für die ERESOURCE zu bestimmen, und verwenden Sie ExGetExclusiveWaiterCount , um die Anzahl der exklusiven Kellner für die ERESOURCE zu bestimmen.