Angenommen, ich starte a std::thread
und dann detach()
es, sodass der Thread weiterhin ausgeführt wird, obwohl der Thread, der std::thread
ihn einmal dargestellt hat, außerhalb des Gültigkeitsbereichs liegt.
Angenommen, das Programm verfügt nicht über ein zuverlässiges Protokoll zum Verbinden des getrennten Threads 1 , sodass der getrennte Thread beim main()
Beenden weiterhin ausgeführt wird.
Ich kann im Standard (genauer gesagt im Entwurf von N3797 C ++ 14) nichts finden, was beschreibt, was passieren soll. Weder 1.10 noch 30.3 enthalten relevante Formulierungen.
1 Eine andere, wahrscheinlich äquivalente Frage lautet: "Kann ein losgelöster Thread jemals wieder verbunden werden?" Entscheiden Sie sich, den Thread kurz nach der Signalisierung für eine Stunde in den Ruhezustand zu versetzen, ohne dass das empfangende Ende zuverlässig erkennen kann, dass der Thread tatsächlich beendet wurde.
Wenn das Auslaufen main()
mit getrennten Threads ein undefiniertes Verhalten ist, ist jede Verwendung von std::thread::detach()
undefiniertem Verhalten, es sei denn, der Hauptthread wird nie beendet 2 .
Das Auslaufen main()
mit abgelösten Threads muss daher definierte Auswirkungen haben. Die Frage ist: Wo (im C ++ - Standard nicht POSIX, nicht OS-Dokumente, ...) sind diese Effekte definiert.
2 Ein losgelöster Faden kann nicht verbunden werden (im Sinne von std::thread::join()
). Sie können auf Ergebnisse von getrennten Threads warten (z. B. über eine Zukunft von std::packaged_task
oder durch ein Zählsemaphor oder ein Flag und eine Bedingungsvariable), dies garantiert jedoch nicht, dass die Ausführung des Threads abgeschlossen ist . Wenn Sie den Signalisierungsteil nicht in den Destruktor des ersten automatischen Objekts des Threads einfügen , gibt es im Allgemeinen Code (Destruktoren), der nach dem Signalisierungscode ausgeführt wird. Wenn das Betriebssystem plant, dass der Hauptthread das Ergebnis verbraucht und beendet wird, bevor der getrennte Thread die Ausführung der Destruktoren beendet, was wird dann definiert?
std::exit
oder dem Verlassen vonmain
ist ausreichend, aber nicht notwendig, um diese Anforderungen zu erfüllen." (Der gesamte Absatz kann relevant sein.) Siehe auch [support.start.term] / 8 (std::exit
wird aufgerufen, wennmain
zurückgegeben wird)