Frage

Ist fprintf Thread-sicher? Die glibc Handbuch scheint es zu sagen , aber meine Anwendung, die in eine Datei mit einzelnem Aufruf schreibt scheint fprintf () teilweise schreibt von verschiedenen Prozessen zu Verwirbelung.

Bearbeiten: Um zu klären, ist das Programm in Frage eine lighttpd Plugin, und der Server läuft mit mehrere Arbeitsthreads.

in der Datei suchen, sind einige der Schreib verwirbelt.

bearbeiten 2: Es scheint, das Problem, das ich wegen „Worker-Threads“ tatsächlich getrennt ist Prozess lighttpd könnte sein, bin zu sehen: http: //redmine.lighttpd. net / wiki / lighttpd / Docs: Multiprocessor

  

Probleme

     

Durch das Ausführen von 2 oder mehr Prozesse auf die   gleiche Buchse haben Sie eine bessere   Gleichzeitigkeit, sondern haben ein paar   Nachteile, die Sie sein müssen bewusst   von:

     
      
  • mod_accesslog könnte gebrochen Zugriffsprotokolle erstellen, wie die gleiche Datei zweimal geöffnet wird und nicht synchronisiert ist.
  •   
  • mod_status haben n separate Zähler, ein Satz für jede   Prozess.
  •   
  • mod_rrdtool wird fehlschlagen, da sie den gleichen Zeitstempel erhält das Doppelte.
  •   
  • mod_uploadprogress nicht die richtigen Status angezeigt.
  •   
War es hilfreich?

Lösung

Du verwechselst zwei Konzepte -. Schreiben von mehreren Threads und Schreiben von mehreren Prozessen

Innerhalb eines Prozesses seiner möglichen, um sicherzustellen, dass ein Aufruf von fprintf abgeschlossen ist, bevor die nächste Zugriff auf den Ausgangspuffer erlaubt ist, aber wenn Sie Ihre App, dass die Ausgabe in eine Datei Pumpen Sie auf Gedeih und Verderb der OS sind. Ohne irgendeine Art von OS-basierten Verriegelungsmechanismus kann nicht sichergestellt werden, dass eine ganz andere Anwendung tut, um Ihre Log-Datei schreiben.

Andere Tipps

Klingt für mich wie Sie auf lesen, müssen Sperren von Dateien . Das Problem, das Sie haben, ist, dass mehrere Prozesse (das heißt nicht Threads) auf die gleiche Datei schreiben gleichzeitig, und es gibt keine zuverlässige Möglichkeit, die Schreibvorgänge, um sicherzustellen, wird atomar sein. Diese in Dateien führen kann jeder des anderen schreibt, gemischte Ausgabe, und insgesamt nicht-deterministisches Verhalten zu überschreiben.

Das hat nichts mit Threadsicherheit zu tun, da dies nur in Einzelprozess Multithreading-Programmen relevant ist.

Die aktuelle C ++ Standard sagt nichts Brauchbares über Gleichzeitigkeit, noch ist die 1990-C-Standard. (Ich habe nicht den 1999-C-Standard lesen, so kommentieren kann mich nicht darauf,. Der bevorstehende C ++ 0x-Standard Dinge nicht sagen, aber ich weiß nicht genau, was Stegreif)

Das bedeutet, dass fprintf () selbst wahrscheinlich weder Thread-sicher noch anders, und dass es bei der Umsetzung abhängen. Ich hatte gelesen, genau das, was die glibc Dokumentation sagt über sie, und vergleichen Sie es mit genau das, was Sie tun.

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