Michael Schröpl: Perl gleichzeitiger Dateizugriff

Beitrag lesen

[...], indem ich vor jedem Schreibzugriff eine Dummy-Datei anlege, die sozusagen als Markierung dient. Vor jedem Lesezugriff prüfe ich in einer while-Schleife, ob diese Datei existiert. Vorsicht, es kann zu einer Endlosschleife führen, deshalb prüfe nur z.B. 10 mal und warte dazwischen mit select(undef,undef,undef,0.1) eine Zehntelsekunde (z.B.).
Die Idee ist famous. ich habe deshalb eine kleine Funktion erstellt, die genau das macht.

Ich halte die Idee mit der Datei nicht für so "famos" (obwohl ich praktisch dasselbe hier in einem Produkt implementiert habe, weil ich ein Semaphor auf einer shell-Ebene haben wollte und das am schnellsten ging ;-).

Wenn die Daten kostbar sind, dann ist eine Datei als Synchronisation nicht gut genug.
Das Problem ist, daß es eine kritische Phase gibt, nämlich genau zwischen dem Prüfen der Sperr-Datei und dem Anlegen der Sperrdatei. Wenn das zwei Prozesse gleichzeitig versuchen, dann sind beide drin in der gefährlichen Zone.
Der Trick muß darinbestehen, das Testen und das Setzen des Semaphors als unteilbare Operation durchzuführen. Auf alten Großrechnern gab es dafür bereits spezielle Maschinenbefehle "Test and Set", die genau so etwas mit einem Bit im Hauptspeicher tun konnten - selbst wenn durch einen Prozeßwechsel ein anderer Prozeß die CPU bekommt, kann er doch nicht diesen einen Befehl unterbrechen.

So gesehen ist flock() eine wesentlich zuverlässigere Methode.
Wenn Dir Deine Daten kostbar sind, dann solltest Du bei Synchronisation auf keinen Fall mit der zweitbesten Lösung zufrieden sein.