2016-06-29 12 views
3

Normalerweise werden alle Threads beendet, wenn main() beendet wird. pthread_exit(3) sagtDo C++ 11 Threads bieten eine Möglichkeit für losgelöste Threads nach dem Beenden des Hauptthreads fortzusetzen?

andere Threads zu ermöglichen, weiterhin Ausführung sollte der Haupt-Thread beenden, indem pthread_exit() statt Ausgang (3).

Gibt es einen äquivalenten C++ 11 API-Aufruf? So etwas wie std::this_thread::exit(0)?

+0

Vielleicht sollten Sie eher nach etwas suchen (http://stackoverflow.com/questions/3095566/linux-daemonize) (nicht tragbar, ich weiß). –

+0

Warum möchten Sie, dass Ihre Threads nach dem Beenden des Hauptthreads weiter ausgeführt werden? Kannst du nur darauf warten, dass sie zuerst fertig sind? – Dylon

+1

@Dylon Um ehrlich zu sein, ich hoffe, der Standard sagt, das ist nicht erlaubt. Macht etwas, an dem ich arbeite, einfacher. –

Antwort

0

Historisch gesehen war die main() Funktion eine besondere - sie repräsentiert die Lebensdauer der Anwendung. C++ 11 ändert das nicht.

Wenn die Funktion main zurückkehrt, wird das Programm bereinigt und beendet. Das ist in der C-Laufzeit fest programmiert.

Alles, was verhindert, dass main von Neuabstimmung normalerweise funktioniert (aber es gibt keine portable Möglichkeit, einen Thread zu beenden).

Ein Workaround in Ihr Fall möglicherweise nur, um den Haupt Thread für immer zu blockieren, oder verwenden Sie es erneut, um einige Überwachung/Housekeeping zu tun.

0

Seite 1121 der Working Draft, Standard for Programming Language C++ von 2012-01-16 scheint einmal die Haupt-Thread beendet wird, werden seine freistehenden Fäden und aufgeräumt (es sei denn, ich bin falsch interpretiert) zu erklären, dass:

Leere ablösen();

Benötigt: joinable() ist wahr.

Effekte: Der durch * dargestellte Thread setzt die Ausführung fort, ohne dass der aufrufende Thread blockiert. Wenn detach() zurückkehrt, * repräsentiert dies nicht mehr den möglicherweise andauernden Thread der Ausführung. Wenn der Thread, der zuvor durch * dargestellt wurde, die Ausführung beendet, muss die Implementierung alle Ressourcen freigeben, die ihnen gehören.

Nachbedingung: get_id() == id().

Auslöser: system_error, wenn eine Ausnahme erforderlich ist (30.2.2).

Fehlerbedingungen:

- no_such_process - wenn der Faden nicht gültig ist.

- invalid_argument - wenn der Thread nicht verbindbar ist.

+4

Sie sind nicht "aufgeräumt", sie hören einfach auf zu existieren. Wenn sie zwischen dem Hauptthread, der von main zurückkehrt, und dem Prozess, der tatsächlich beendet wird, auf globale Objekte zugreifen (z. B. während globale Destruktoren ausgeführt werden), riskieren Sie undefiniertes Verhalten.Die von Ihnen zitierte Formulierung über _ "die Implementierung soll alle eigenen Ressourcen freigeben" _ redet davon, wenn der gelöste Thread beendet wird, aber das Zurückkehren von 'main' verursacht das nicht, die gelösten Threads laufen noch. –

Verwandte Themen