Situation: Ich habe ein Multithread-Programm, das in C geschrieben wird. Wenn einer der Threads fork, wird der unterordnete Prozess durch einen anderen ersetzt, der exec () verwendet, und das übergeordnete Element wartet auf das Kind, um zu beenden.
Problem: Nachdem der untergeordnete Prozess von fork () erstellt wurde, gibt es einige Zeilen Code, die die Argumente kompilieren, die im folgenden Befehl exec () verwendet werden.
Hypothese Bin ich richtig in der Annahme, dass in der Zeit zwischen dem Child-Prozess, der durch fork () erstellt und durch exec () ersetzt wird, der Child-Prozess - eine Kopie des Elterns - alle Threads des Elterns und daher diese Threads haben wird wird laufen - wenn auch nur für eine sehr kurze Zeit?
Wenn ja, ist die richtige Lösung, exec () unmittelbar nach fork () aufzurufen?
Nur der Thread, der fork
aufruft, wird im neuen Prozess ausgeführt. Es gibt jedoch Einschränkungen, welche Funktionen Sie vor exec
aufrufen können. Von fork
:
Ein Prozess soll mit einem erstellt werden einzelner Thread. Wenn ein Multi-Thread Prozessaufrufe
fork()
, der neue Prozess soll eine Replik des Aufrufenden enthalten Thread und sein gesamter Adressraum, möglicherweise einschließlich der Staaten von Mutexe und andere Ressourcen. Folglich, um Fehler zu vermeiden, die Kindprozess kann nur ausgeführt werden async-signalsichere Operationen bis wie eine derexec
-Funktionen wird genannt. Gabel Handler können durch Mittel festgestellt werden derpthread_atfork()
Funktion in um die Bewerbung aufrechtzuerhalten Invarianten überfork()
Aufrufe.
Ich glaube, das bedeutet, dass Sie im Allgemeinen in Ordnung sein sollten, so lange wie Multi-Threaded
Bibliotheken verwenden pthread_atfork
richtig.
BEARBEITEN: Die Seite pthread_atfork
erklärt weiter, wie sich die Bibliothek selbst schützen kann:
Die erwartete Verwendung ist, dass die Vorbereitung Handler erwirbt alle Mutex-Sperren und die anderen beiden Gabelstapler geben frei sie.
Beispielsweise kann eine Anwendung liefern eine Vorbereitungsroutine, die den Notwendig Mutexes die Bibliothek pflegt und versorgt Kind und Elternteil Routinen, die diese Mutexe freigeben, So stellen Sie sicher, dass das Kind eine bekommt konsistente Momentaufnahme des Zustands von die Bibliothek (und das sind keine Mutexe links gestrandet). Alternativ, einige Bibliotheken könnten nur liefern können eine Kinderroutine, die das neu initialisiert Mutexe in der Bibliothek und alle assoziierte Staaten zu einem bekannten Wert (Zum Beispiel, was es war, als die Bild wurde ursprünglich ausgeführt).
Wie @Matthew in seiner Antwort geschrieben hat, sind die anderen Threads des übergeordneten Prozesses im untergeordneten Prozess nicht vorhanden (wenn Sie PThreads verwenden).
Beachten Sie, dass es nicht helfen würde, den Aufruf von exec () unmittelbar nach dem Aufruf von fork zu platzieren, da sonst die Möglichkeit besteht, dass die anderen Threads vor dem Aufruf von exec ausgeführt würden (). Sie können dies jedoch steuern, indem Sie vor dem Aufruf von fork () einen Mutex sperren. Dieser wird durch den Aufruf von exec () im Wesentlichen zerstört.
Ich dachte auch, dass alle Threads auch im Child-Prozess repliziert werden. Das stimmt aber nicht. Da andere Threads im untergeordneten Prozess nicht repliziert werden, müssen Sie, wenn Sie Mutexe / Sperren vor exec verwenden, sicherstellen, dass die fork-Handler so geschrieben sind, dass sie sie richtig behandeln. Hier ist ein Artikel darüber. Ссылка
Tags und Links c multithreading exec fork pthreads