Załóżmy, że zaczynam std::threada detach(), więc wątek kontynuuje wykonywanie, mimo że ten, std::threadktóry kiedyś go reprezentował, wykracza poza zakres.
Załóżmy ponadto, że program nie ma niezawodnego protokołu do przyłączania się do odłączonego wątku 1 , więc odłączony wątek nadal działa po zakończeniu main().
Nie mogę znaleźć niczego w standardzie (a dokładniej w szkicu N3797 C ++ 14), który opisuje, co powinno się stać, ani 1.10, ani 30.3 nie zawierają stosownego sformułowania.
1 Kolejne, prawdopodobnie równoważne, pytanie brzmi: „czy odłączony wątek może kiedykolwiek zostać ponownie połączony”, ponieważ niezależnie od tego, jaki protokół zostanie wymyślony do przyłączenia, część sygnalizacyjna musiałaby zostać wykonana, gdy wątek nadal działał, a harmonogram systemu operacyjnego mógłby zdecydować o uśpieniu wątku na godzinę tuż po zakończeniu sygnalizacji, bez możliwości niezawodnego wykrycia przez odbiorcę, że wątek faktycznie się zakończył.
Jeśli wyczerpanie się main()z odłączonymi wątkami jest niezdefiniowanym zachowaniem, to każde użycie std::thread::detach()jest niezdefiniowane, chyba że główny wątek nigdy nie kończy pracy 2 .
Zatem wyczerpanie się main()z odłączonymi wątkami musi mieć określone efekty. Pytanie brzmi: gdzie (w standardzie C ++ , nie POSIX, nie dokumentacja systemu operacyjnego, ...) są te efekty zdefiniowane.
2 Oderwanej nitki nie można łączyć (w sensie std::thread::join()). Ty może czekać na wyniki z wolnostojących wątków (np poprzez przyszłość z std::packaged_tasklub przez semafor liczenia lub flagi i zmiennej stan), ale to nie gwarantuje, że wątek zakończeniu wykonywania . Rzeczywiście, chyba że można umieścić rolę sygnalizacyjną do destructor pierwszego automatycznego przedmiotu wątku, nie będzie w ogóle, być kod (destruktory), który prowadzony po kodu sygnałowego. Jeśli system operacyjny zaplanuje, że główny wątek zużyje wynik i zakończy działanie, zanim odłączony wątek zakończy działanie wspomnianych destruktorów, co ^ Wis zostanie zdefiniowane jako wystąpienie?
std::exitlub wyjściem zmainjest wystarczające, ale nie jest konieczne, aby spełnić te wymagania”. (cały akapit może mieć znaczenie) Zobacz także [support.start.term] / 8 (std::exitjest wywoływany, gdymainzwraca)