2012-04-09 12 views
12

In C++ mit Pthreads, was passiert mit Ihren anderen Threads, wenn einer Ihrer Threads fork ruft?Was passiert mit anderen Threads, wenn ein Thread sich verzweigt()?

Es scheint, dass die Threads nicht folgen. In meinem Fall versuche ich einen Daemon zu erstellen und benutze fork() mit dem Eltern-Enting, um ihn zu deamonisieren. In einem neuen Pfad durch den Code erzeuge ich jedoch einige Threads vor dem fork und einige danach. Gibt es eine einfache Möglichkeit, den Besitz der Threads auf den neuen gegabelten Prozess zu ändern, anstatt alle meine Thread-Erstellung nach der Verzweigung zu verschieben?

+0

Wie Sie inzwischen herausgefunden haben könnte, ist dies eine wirklich schlechte Idee. Wenn Sie diese Art von Bedenken in einer realen Anwendung haben, würde ich vorschlagen, den Grund herauszufinden, warum Sie das tun sollten, herauszufinden, wie der richtige Weg dazu ist und eine richtige Refactoring: D – Dacav

Antwort

18

Nichts. Nur der Thread, der fork() aufruft, wird dupliziert. Der Kindprozess muss neue Threads starten. Die Eltern-Threads bleiben alleine.

+1

Was passiert mit den Threads wann das Elternteil des Gabelausgangs() s? – WilliamKF

+0

@WilliamKF http://stackoverflow.com/questions/395877/are-child-processes-created-with-fork-automatisch-killed-when-the-parent-is –

0

Nichts, es sei denn, man wird von dem Thread, der den neuen Prozess ausführt, vorweggenommen.

0

In POSIX, wenn ein Multithread-Prozess gabelt, sieht der Kindprozess genau wie eine Kopie des übergeordneten, aber in dem alle Threads in ihren Spuren gestoppt und verschwanden.

Dies ist sehr schlecht, wenn die Fäden Sperren halten.

Aus diesem Grund gibt es einen einfachen Mechanismus namens pthread_atfork, in dem Sie Handler für diese Situation registrieren können.

Jedes ordnungsgemäß geschriebene Programmmodul (und insbesondere wiederverwendbare Middleware), das Mutexe verwendet, muss pthread_atfork aufrufen, um einige Handler zu registrieren, so dass es sich nicht falsch verhält, wenn der Prozess fork aufruft.

Neben Mutex-Sperren können Threads auch andere Ressourcen haben, z. B. Thread-spezifische Daten, die mit pthread_setspecific verschrottet sind und die nur für den Thread zugänglich sind (und der Thread für die Bereinigung über einen Destruktor zuständig ist).

Im untergeordneten Prozess wird kein solcher Destruktor ausgeführt. Der Adressraum wird kopiert, aber der Thread und sein threadspezifischer Wert sind nicht vorhanden, so dass der Speicher im untergeordneten Element verloren geht. Dies kann und sollte auch mit pthread_atfork Handlern behandelt werden.

3

Es ist normalerweise sehr schlecht, einen Thread zu forkieren. Der gegabelte Prozess soll eine vollständige Kopie des Elternteils sein, außer bei Threads, die es nicht ist. Es gibt eine Funktion pthread_atfork(), die manchmal hilft. Wenn Sie einen Thread abzweigen müssen, rufen Sie am besten exec() direkt nach dem fork() an.

Ich schlage vor, Sie die Einsprüche von dem POSIX-Entwickler in der Dokumentation von fork() lesen und pthread_atfork() (Siehe http://pubs.opengroup.org/onlinepubs/007904975/functions/fork.html und http://pubs.opengroup.org/onlinepubs/007904975/functions/pthread_atfork.html).

Von der fork() Dokumentation:

Die fork() Funktion somit nur verwendet, um neue Programme und den Auswirkungen des Aufrufs von Funktionen auszuführen, die zwischen dem Aufruf von fork() und dem Aufruf zu einer exec Funktion bestimmte Ressourcen erfordern, sind nicht definiert.

Verwandte Themen