Multithreading/Multiprocessing
-
Ich habe einen Prozess unter dem mehrere Threads laufen.
Die Threads greifen auf globale Interfaces unter anderem für Logging
und Datenbankzugriffe zu, die durch Locks synchronisiert werden.
Das funktioniert alles einwandfrei.Zudem werden von den Threads zyklisch neue Kindprozesse erzeugt.
Momentan sind die Kindprozesse vollkommen unabhängig vom Hauptprozess
(eigene executable) aber falls möglich würde ich den Kindprozessen
gerne auch ermöglichen auf die globalen Interfaces zuzugreifen.Wie verhält sich das beim Logging?
Nach dem fork des Kindprozesses teilen sich Elternprozess
und Kindprozess dasselbe Filehandle und haben beide Schreibrechte.
Sychronisiert der Kernel die Schreibzugriffe auf das Filehandle
bzw. kann ich die prozessübergreifende Sychronisation erzwingen?Wie verhält es sich mit fremden Bibliotheken wie z.b. der Mysql c api?
Der Datenbereich wird beim fork ja komplett kopiert. Kann ich im
Kindprozess bedenkenlos mit der Verbindungskopie zur Mysql Datenbank weiterarbeiten?Danke im Voraus
-
Sovok schrieb:
Wie verhält sich das beim Logging?
Nach dem fork des Kindprozesses teilen sich Elternprozess
und Kindprozess dasselbe Filehandle und haben beide Schreibrechte.
Sychronisiert der Kernel die Schreibzugriffe auf das Filehandle
bzw. kann ich die prozessübergreifende Sychronisation erzwingen?Die Synchronisation kannst du, soweit ich weiß, nicht erzwingen. Es kann also sein, dass wegen dem Zwischenspeichern, die Ausgabe zeitlich in einer anderen Reihenfolge erfolgt.
Sovok schrieb:
Wie verhält es sich mit fremden Bibliotheken wie z.b. der Mysql c api?
Der Datenbereich wird beim fork ja komplett kopiert. Kann ich im
Kindprozess bedenkenlos mit der Verbindungskopie zur Mysql Datenbank weiterarbeiten?Nein. Siehe oben. Da jetzt zwei Prozesse gleichzeitig auf den Filedeskriptor zugreifen, kommt bei dem einen halt der eine Teil, bei dem anderen der andere Teil der Daten an. Mal davon abgesehen, dass MySQL vermutlich auch ne menge Müll zugesendet bekommt, da die beiden Datenströme sich überschneiden können. Du müsstest also eine neue MySQL Verbindung aufmachen und die alte schließen.
-
ok danke... das is gut genug
die reihenfolge ist eh relativ egal solange sich die daten nich ineinander verhaken und unleserlich werden
-
Sovok schrieb:
ok danke... das is gut genug
die reihenfolge ist eh relativ egal solange sich die daten nich ineinander verhaken und unleserlich werdenOkay... Solange die Reihenfolge der bytes egal ist... Was anderes ist, soweit ich weiß, nicht garantiert. Ich denke, dass ein
sync (2)
immer die Puffer hintereinander wegschreibt und nicht verwürfelt, aber man weiß ja nicht genau, wann der auftritt.