(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.