GNU/Linux >> LINUX-Kenntnisse >  >> Linux

return() versus pthread_exit() in pthread-Startfunktionen

(1) In C++-Code mit return bewirkt, dass der Stack entladen und lokale Variablen zerstört werden, während pthread_exit wird garantiert nur Abbruch-Handler aufrufen, die mit pthread_cancel_push() registriert sind . Auf einigen Systemen wird dieser Mechanismus auch dazu führen, dass die Destruktoren für lokale C++-Variablen aufgerufen werden, aber dies ist für portablen Code nicht garantiert – überprüfen Sie Ihre Plattformdokumentation.

Auch in main() , return wird implizit exit() aufrufen , und damit das Programm beenden, während pthread_exit() beendet lediglich den Thread, und das Programm läuft weiter, bis alle Threads beendet sind oder ein Thread exit() aufruft , abort() oder eine andere Funktion, die das Programm beendet.

(2) Die Verwendung von return funktioniert, weil die POSIX-Spezifikation es so sagt. Der zurückgegebene Wert wird an einer Stelle gespeichert, an der pthread_join() kann es abrufen. Die vom Thread verwendeten Ressourcen werden bis pthread_join() nicht zurückgefordert heißt.

(3) Ich verwende niemals den Rückgabewert eines Threads in rohen POSIX-Threads. Ich neige jedoch dazu, übergeordnete Einrichtungen wie die Boost-Thread-Bibliothek und in jüngerer Zeit die C++0x-Thread-Bibliothek zu verwenden, die alternative Mittel zum Übertragen von Werten zwischen Threads wie Futures bieten, wodurch die Probleme im Zusammenhang mit der Speicherverwaltung vermieden werden, die Sie beschrieben haben anspielen.


Ich denke, dass return aus dem start_routine ist vorzuziehen, da es sicherstellt, dass der Aufrufstapel ordnungsgemäß abgewickelt wird.

Dies ist für C sogar noch wichtiger als für C++, da es nicht über die Destruktor-Magie verfügt, die das Durcheinander nach vorläufigen Exits aufräumt. Ihr Code sollte also alle letzten Teile der Routinen auf der Aufrufliste durchlaufen, um free auszuführen s und dergleichen.

Warum das funktioniert, ist einfach

Wenn die start_routine zurückkehrt, soll die Wirkung so sein, als ob es einen impliziten Aufruf von pthread_exit() gegeben hätte, der den Rückgabewert von start_routine als Exit-Status verwendet

Für meine persönliche Erfahrung neige ich dazu, den Status beendeter Threads nicht viel zu verwenden. Deshalb habe ich oft die Threads detached gestartet . Dies dürfte aber stark von der Anwendung abhängen und ist sicher nicht verallgemeinerbar.


Linux
  1. Starten Sie einen Prozess auf einem anderen Tty?

  2. Sicherungen auf Byte- und Dateiebene?

  3. Prozessstartzeit mit Zeitzone?

  4. Dienste in Linux aktivieren

  5. Ist errno Thread-sicher?

Bash-Funktionen

Beginnen Sie mit GNUPlot

Linux-Kernel und seine Funktionen

Wie bekomme ich die Thread-ID eines Pthreads im Linux-C-Programm?

Rückgabewert von x =os.system(..)

Wie startet PulseAudio?