Frage

Hier ist das Ding: Ich habe zwei Anwendungen in C ++ geschrieben und auf zwei Rechner mit unterschiedlichem Betriebssystem ausgeführt wird (ein Linux und ein Windows). Eines dieser Verfahren ist für eine XML-Datei auf einem NAS (Network Attached Storage) zu aktualisieren, während der andere diese Datei liest.

Ist es möglich, diese beiden Prozesse zu synchronisieren, um das Lesen der Datei zur gleichen Zeit zu vermeiden, dass es geändert wird?

War es hilfreich?

Lösung

Sie können eine Sperrdatei auf dem Server erstellen, die erstellt wird, bevor Sie eine Schreib tun, warten dann schreiben und nach Abschluss löschen., Haben Sie den Lesevorgang Prüfung für das Token vor, die Datei zu lesen.

Bearbeiten : die Kommentare zu adressieren, können Sie ein Doppel Karomuster Schließungstyp implementieren. Haben beide Leser und -schreiber eine Sperrdatei und überprüfen, bevor Sie Arbeit tun, so etwas wie:

Reader. Überprüfen Sie für den Schreibsperrdatei, erstellen Sie lesen Sperrdatei, prüfen Schreibsperrdatei, wenn Lese-Datei vorhanden ist löschen und abbrechen

Writer:. Überprüfen Sie für Lesesperre Datei, Schreibsperrdatei erstellen, überprüfen Sie für Lesesperre Datei, liegt vor, wenn Schreibsperrdatei löschen und abbrechen

Dies wird Ihre Prozesse trampelt aufeinander zu stoppen, sondern eine mögliche Race-Bedingung in auftreten kann, dass die Sie möglicherweise beiden Prozesse haben könnten überprüfen, erstellen Sie gleichzeitig überprüfen, obwohl diese die Daten nicht dazu führen, dass in einem inkonsistenten Zustand gelesen werden, sondern wird führen sowohl Lese- als auch Schreibvorgänge für Ihre angegebene Verzögerung abbrechen

Andere Tipps

Vielen Dank für Ihre Antworten.

Endlich konnten wir unser Problem lösen, nicht durch Befehle des Betriebssystems unter Verwendung von Sperren (weil wir nicht sicher waren, sie richtig an das Betriebssystem des NAS-Kopf ausbreiten würde), sondern durch die Schaffung von Lock-Verzeichnisse anstelle von Lock-Dateien. Verzeichniserstellung ist eine atomare Operation und gibt einen Fehlerwert, wenn der Ordner bereits vorhanden ist. Deshalb müssen wir die Sperre Existenz nicht überprüfen vor dem Erwerb es, beiden Vorgänge in einem einzigen Schritt hergestellt werden.

OK müssen Sie irgendeine Form von Verriegelungsmechanismus Zugriffe zu steuern.

Die meisten * nix-Dateisysteme bieten diese. Ich vermute, dass es auf Windows-Dateisystem auch verfügbar ist (wie dieser Mechanismus von Perl verwendet wird), aber es kann einen anderen Namen haben.

Werfen Sie einen Blick auf die Herde ().
Diese Datei und Verriegelungsmechanismus. Es ist ein beratendes Sperre, damit es nicht eigentlich die Datei sperrt und Nutzung zu verhindern, aber es bietet einen Mechanismus, um die Datei für die Markierung. Wenn beide Anwendungen den Mechanismus verwenden, dann können Sie Zugriffe auf die Datei steuern.

flock () bietet sowohl gemeinsame Sperren (oder READ-Sperre) und exklusive Sperren (oder Schreibsperre). Herd wird der Thread Block (in einer nicht besetzt Weise), bis die Datei durch den Benutzer freigeschaltet wurde (es auch nicht blockierende Kontrollen bietet, so dass Sie andere Dinge tun können, während des Wartens).

Überprüfen Sie heraus Herde in Abschnitt 2 der man-Seiten.

int     flock(int fd, int operation);

Flock() applies or removes an advisory lock on the file associated with the file
descriptor fd.  A lock is applied by specifying an operation parameter that is
one of LOCK_SH or LOCK_EX with the optional addition of LOCK_NB.  To unlock an
existing lock operation should be LOCK_UN.

Wenn die Dateien auf einem NFS befinden teilen können Sie verwenden, fcntl (2) die Datei zu sperren. Sieh Dir die Frage D10 in der Linux NFS FAQ . Ich habe sehr wenig Erfahrung mit APIs Fenster, aber von dem, was ich sie haben Unterstützung gut POSIX gehört haben, so sollten Sie in der Lage sein, so lange verwenden fcntl als sie POSIX.1-2001 unterstützen.

Wenn Sie die Dateien mit unterschiedlichen Protokollen zugreifen (d AFS oder SMB) vielleicht könnten Sie einen einfachen Synchronisationsserver einrichten, die Sperren über eine IPC-Schnittstelle verwaltet?

Wäre es möglich, von Dateien in einer Datenbank zu wechseln?

Diese Art von concurency ist etwas, das DBMS-Systemen sehr gut verwalten. Es muss nicht teuer oder schwierig zu installieren. MySql, Postgress oder JavaDB würde dies alles behandeln elegant mit wenig oder gar keine Kosten.

, um die Datenbankoption Failing ich den Schreibprozess Schreiben auf ein „versteckten“ Dateinamen haben würde wie „.updateinprogress.xml“ und benennen Sie die Datei, wenn die Aktualisierung abgeschlossen ist. Auf den meisten Systemen „mv“ oder „ren“ ist eine atomare Operation so dass der Lesevorgang entweder nimmt hte alte Datei oder die neuere Datei aber nie eine Hälfte geschrieben ein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top