Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden die ERESOURCE-Struktur und die vom System bereitgestellten Routinen beschrieben, die darauf ausgeführt werden. Sie können ERESOURCE-Strukturen verwenden, um Lese-/Schreibsperre in Ihrem Treiber zu implementieren.
ERESOURCE-Struktur
Die ERESOURCE-Struktur wird verwendet, um den Zugriff auf freigegebene Ressourcen zu verwalten. Es bietet einen Mechanismus zum Synchronisieren des Zugriffs auf Ressourcen, die für mehrere Threads freigegeben werden können.
Die ERESOURCE-Struktur ist undurchsichtig; d. h., seine Mitglieder sind für die Systemverwendung reserviert.
Der Speicher für ERESOURCE muss aus einem nicht ausgelagerten Pool zugewiesen werden.
ERESOURCE-Routinen
Das System bietet Routinen zum Abrufen und Freigeben von ERESOURCE-Strukturen und zum Untersuchen des aktuellen Zustands.
Erwerben und Freigeben einer ERESOURCE-Struktur
Treiber können die ERESOURCE-Strukturen verwenden, um die 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 erworben werden, wenn keine Threads bereits als freigegeben erworben wurden.
Ein Thread, der derzeit keine ERESOURCE abrufen kann, kann optional in einen Wartezustand versetzt werden, bis die ERESOURCE erworben werden kann. Das System verwaltet zwei Listen von Threads, die auf eine ERESOURCE warten: eine Liste der exklusiven Waiters und eine Liste der freigegebenen Waiters.
Eine typische Verwendung für die exklusive/freigegebene Synchronisierung besteht darin, eine Lese-/Schreibsperre zu implementieren. Eine Lese-/Schreibsperre ermöglicht es mehreren Threads, einen Lesevorgang auszuführen, aber es kann jeweils nur ein Thread geschrieben werden. Dieses Szenario kann direkt im Hinblick auf den Erwerb einer ERESOURCE implementiert werden.
Ein Treiber weist 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:
Erwerben Sie eine ERESOURCE als freigegeben mit ExAcquireResourceSharedLite. Diese Routine erwirbt die Ressource nur, wenn die Ressource nicht ausschließlich erworben wurde und keine exklusiven Kellner vorhanden sind.
Erwerben Sie eine ERESOURCE exklusiv mit ExAcquireResourceExclusiveLite. Diese Routine erwirbt die Ressource, solange sie nicht ausschließlich oder als freigegeben erworben wurde.
Wandeln Sie eine exklusive Übernahme in eine gemeinsame Übernahme mit ExConvertExclusiveToSharedLite um.
Freigeben einer erworbenen Ressource mit ExReleaseResourceLite.
Der Wait-Parameter von ExAcquireResourceSharedLite und ExAcquireResourceExclusiveLite bestimmt, ob der aktuelle Thread auf das Abrufen der ERESOURCE wartet. Wenn Sie einen Wert von FALSE angeben und die ERESOURCE nicht abgerufen werden kann, gibt die Routine FALSE zurück. Wenn Sie einen Wert von TRUE angeben, wird der aktuelle Thread in der entsprechenden Warteliste für die ERESOURCE platziert.
Untersuchen des Zustands einer ERESOURCE-Struktur
Ein Treiber kann auch den aktuellen Zustand einer ERESOURCE wie folgt bestimmen:
Verwenden Sie ExIsResourceAcquiredLite oder ExIsResourceAcquiredSharedLite , um festzustellen, 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 Waiters für die ERESOURCE zu ermitteln, und verwenden Sie ExGetExclusiveWaiterCount , um die Anzahl der exklusiven Waiters für die ERESOURCE zu bestimmen.