Implementierung von idirectschreiterlock-Verbund Dateien
Die Implementierung der Verbund Datei von idirectschreiterlock bietet eine Möglichkeit zum Öffnen einer Verbund Datei im direkten Modus mit einem einzigen Writer und mehreren Lesern.
Verbund Dateien können im direkt Modus mit dem STGM Direct- _ Flag geöffnet werden. Die idirectschreiterlock -Schnittstelle legt das STGM- _ | Schreib kennflag "Read Write STGM" _ _ _ als gültig im direkten Modus fest, ohne dass der Aufwand einer Momentaufnahme Kopie erforderlich ist.
Wenn eine Verbund Datei mit dem transaktiven STGM-Flag im transaktiven Modus geöffnet wird _ , können Sie auch mehrere Reader und einen einzigen Writer verwenden, indem Sie das kennflag zum Schreiben von "STGM" für "read _ Write | STGM" verwenden _ _ _ . In diesem Fall wird jedoch eine Momentaufnahme Kopie der Datei für die Leser erstellt. Der Aufwand für eine Scratch-Kopie ist häufig zu erhöhen.
Verwendungs Zeitpunkt
Verwenden Sie die vom System bereitgestellte Implementierung von idirectschreiterlock , wenn Sie einen Speicher im direkten Modus (STGM _ Direct) mit der STGM-Schreib Schreib-/Schreib-Schreib-Kennzeichnungen für den STGM- _ Lesevorgang | _ _ _
Rufen Sie zum Abrufen eines Zeigers auf idirectschreiterlock QueryInterface für IStorage auf, um das Stamm Speicher Objekt für die Verbund Datei abzurufen.
Rufen Sie idirectschreiterlock:: waitforschreiteaccess auf, um exklusiven Schreibzugriff auf eine Verbund Datei zu erhalten. Aufrufen von idirectschreiterlock:: releaseschreiteaccess , um exklusiven Schreibzugriff freizugeben.
Idirectschreiterlock:: haveschreiteaccess gibt an, ob die Datei zurzeit gesperrt ist.
Bemerkungen
Die Implementierung der Verbund Datei des Single Writer-Features mit mehreren Lese Vorlesern basiert auf Bereichs sperren. Der Writer erhält exklusiven Zugriff auf den zu schreibende Speicher, nachdem alle aktuellen Reader den Speicher geschlossen haben. Während der Writer aktiv ist, können nachfolgende Reader den Speicher nicht öffnen. Der Writer ruft idirectbeschreib terlock:: waitforschreiteaccess auf, um exklusiven Schreibzugriff zu erhalten. Der Writer muss dann " idirectschreiterlock:: releaseschreiteaccess " aufrufen, um den Speicher freizugeben.
Der Aufrufen von idirectwriterlock:: waitforwriteaccess ist vor dem Schreiben in diesem Single Reader-, Multiple Writer-Modus erforderlich. Versucht, in die Datei zu schreiben, ohne idirectbeschreib terlock:: waitforschreiteaccess zuerst aufrufen zu können _ _ . Dieser Fehler wird auch dann zurückgegeben, wenn der Writer die Datei anfänglich geöffnet hat und derzeit keine Datei geöffnet ist.
Überlegungen zu Marshalling
Das benutzerdefinierte Marshalling wird normalerweise verwendet, wenn eine Verbund Datei an einen anderen Prozess auf demselben Computer gemarshallt wird. Beim Marshalling von Speicher werden keine Zugriffsrechte berücksichtigt, und der IStorage -Zeiger wird an den neuen Prozess mit denselben Zugriffs Modi und denselben Zugriffs Modi wie der ursprüngliche Marshallingprozess übermittelt. Weitere Informationen zu Zugriffs Modi finden Sie unter STGM-Konstanten. Beim Marshalling werden keine Sperren erstellt oder überprüft, um exklusiven Schreibzugriff sicherzustellen. In diesem Fall gibt es keine Erzwingung der Richtlinie für den einzelnen Writer für Verbund Dateien, die im Single Writer-Modus (mehrfach Lese Modus) geöffnet sind. Stattdessen wird die Erzwingung intern von der Implementierung der Verbund Datei verarbeitet.
Da der IStorage -Zeiger während des Marshalling an einen anderen Prozess übermittelt wird, kann es vorkommen, dass zwei Prozesse gleichzeitig auf dieselbe Verbund Datei zugreifen können. Obwohl ein Aufrufer exklusiven Schreibzugriff auf den Speicher erhalten hat, indem er idirectbeschreib terlock:: waitforschreiteaccessaufgerufen hat, kann die gemarshallte Version auch gleichzeitig Zugriff haben. Die gemarshallten Versionen müssen nicht geschlossen werden, während der einzelne Writer auf die Datei zugreift. In diesem Fall synchronisiert die Implementierung der Verbund Datei die Schreibvorgänge intern.
Wenn ein einzelner Writer exklusiven Zugriff erhält, indem er, idirectschreiterlock:: waitforschreiteaccessaufruft, verfügt der gemarshallte Speicher auch über Schreibzugriff und muss nicht idirectschreiterlock:: waitforschreiteaccess aufrufen. Beide Prozesse haben Schreibzugriff, und die Synchronisierung wird von der internen Implementierung der Verbund Datei gesteuert.
Zugehörige Themen