Was passiert mit einem getrennten Thread, wenn main () beendet wird?

Angenommen, ich beginne einestd::thread und danndetach() es, so dass der Thread weiterhin ausgeführt wird, obwohl diestd::thread das, was es einmal darstellte, geht aus dem Rahmen.

Angenommen, das Programm verfügt nicht über ein zuverlässiges Protokoll zum Verbinden des gelösten Threads1, so läuft der abgetrennte Thread immer noch wennmain() Ausgänge.

Ich kann in der Norm (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?" Unabhängig davon, welches Protokoll Sie für die Verbindung erfinden, müsste der Signalisierungsteil ausgeführt werden, während der Thread noch ausgeführt wird, und der OS-Scheduler entscheidet möglicherweise den Thread für eine Stunde in den Ruhezustand zu versetzen, kurz nachdem die Signalisierung durchgeführt wurde, ohne dass das empfangende Ende zuverlässig erkennen kann, dass der Thread tatsächlich beendet ist.

Wenn es knapp wirdmain() Wenn getrennte Threads ausgeführt werden, ist das Verhalten dann undefiniertirgendein Gebrauch vonstd::thread::detach() ist undefiniertes Verhalten, es sei denn, der Hauptthread wird nie beendet2.

So läuft ausmain() mit abgetrennten Threads muss laufen habendefiniert Auswirkungen. Die Frage ist:woher (in demC ++ Standard, nicht POSIX, nicht OS-Dokumente, ...) sind die definierten Effekte.

2 Ein losgelöster Thread kann nicht verbunden werden (im Sinne vonstd::thread::join()). Siekönnen Warten auf Ergebnisse von getrennten Threads (z. B. über eine Zukunft vonstd::packaged_task, oder durch ein Zählsemaphor oder ein Flag und eine Bedingungsvariable), aber das garantiert nicht, dass dieThread ist fertig ausgeführt. In der Tat, es sei denn, Sie legen den Signalisierungsteil in den Destruktor des ersten automatischen Objekts des ThreadswerdenSeien Sie im Allgemeinen Code (Destruktoren), die ausgeführt werdennach dem der Signalisierungscode. Wenn das Betriebssystem den Haupt-Thread so plant, dass er das Ergebnis verbraucht und beendet, bevor der getrennte Thread die Ausführung der Destruktoren beendet, was wird dann geschehen?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage