Załóżmy, że zaczynam std::thread
a detach()
, więc wątek kontynuuje wykonywanie, mimo że ten, std::thread
któ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_task
lub 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::exit
lub wyjściem zmain
jest 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::exit
jest wywoływany, gdymain
zwraca)