Thread Problem mit FileHandle
(24 answers)
Opened by rosti at 2011-04-05 22:27
Eine kleine Zusammenfassung für die Mitleser, worum es hier geht:
Bei einem LOCK_EX muss dafür gesorgt werden, dass es keinen DeadLock gibt, wenn in einer main zweimal (oder mehrfach) ein Objekt erstellt wird, wo ein Handle auf eine Datei zugreift und die Datei für weitere Objekte dieselbe ist. Klarer Fall, wissen wir alle ;) Aber wie wirds gemacht? Möglichkeit 1: Das Erstellen eines zweiten Objekts wird brutal unterbunden (pfui, schäm*). Möglichkeit 2: Vielen Dank an Topeg!!! Das package führt eine Tabelle (Hash) mit denjenigen Dateien, wo bereits ein Handle geöffnet ist (Key: Filename absolute!, Value: 0|1 oder 0|*handle). Damit kann geprüft werden und wenn es dieselbe Datei ist, wird kein neues Handle erzeugt, sondern das bereits Vorhandene genommen. Vorsicht: Es gibt OS's denen ist die Groß- und Kleinschreibung egal, in einem Hash sind jedoch 'D:/TMP/FILE' und 'd:/tmp/file' verschiedene Dinge! File::Spec kann helfen... Nochwas zu tie(): Der Konstruktor ist TIEHASH, TIEARRAY, TIESCALAR... prinzipiell gibt es zwei Möglichkteiten, 'was' der K. zurückgibt (bless anwenden!): 1. Nur den Hash oder Scalar oder Array... Vorteil: Es müssen nur TIE* und UNTIE|DESTROY überschrieben werden, alle anderen Methods werden geerbt von der Basisklasse. Nachteil: Alle weiteren Hilfsvariablen sind paketweit zu fassen, debuggen wird schwierig, weil das Objekt nur die Nutzdaten enthält und die Scalierbarkeit auf zusätzliche Public-Methods wird aufwendig. 2. Die Rückgabe ist das komplette Objekt und das was daraus in die main kommt, wird über interne Methoden organisiert. Ein kleiner Nachteil ist, dass nun _alle Methoden der Basisklasse überschrieben werden müsssen, weil die Nutzdaten irgendwo im Objekt versteckt sind. Vorteil: Paketweite Vars beschränken sich auf ein Minimum. Der Skalierbarkeit sind keine Grenzen gesetzt und die Fehlersuche wird erleichtert (danke Eric F. Johnson). Schönes Wochenende Euch allen, Rolf (macht jetzt ne Radtour) |