Ist glibc-Implementierung von fprintf () Thread-sicher?
-
09-09-2019 - |
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.
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.