Co dzieje się z odłączonym wątkiem po zamknięciu main ()?

Załóżmy, że zaczynamstd::thread i wtedydetach() to, więc wątek kontynuuje wykonywanie, nawet jeślistd::thread który kiedyś go reprezentował, wychodzi poza zakres.

Załóżmy ponadto, że program nie ma niezawodnego protokołu do dołączania odłączonego wątku1, więc odłączony wątek nadal działa, gdymain() wychodzi.

Nie mogę znaleźć niczego w standardzie (dokładniej, w projekcie N3797 C ++ 14), który opisuje, co powinno się stać, ani 1.10, ani 30.3 nie zawierają trafnych sformułowań.

1 Innym, prawdopodobnie równoważnym, pytaniem jest: „czy odłączony wątek może zostać ponownie przyłączony”, ponieważ niezależnie od tego, jaki protokół wymyślisz do przyłączenia, część sygnalizacyjna będzie musiała zostać wykonana, gdy wątek będzie nadal działał, a harmonogram systemu operacyjnego może zadecydować aby spać wątek przez godzinę zaraz po wykonaniu sygnalizacji, bez możliwości, aby odbiorca mógł wiarygodnie wykryć, że wątek rzeczywiście się zakończył.

Jeśli skończy sięmain() w przypadku uruchomionych wątków odłączonych zachowanie jest niezdefiniowanekażdy zastosowaniestd::thread::detach() jest niezdefiniowanym zachowaniem, chyba że główny wątek nigdy się nie kończy2.

Tak więc kończy sięmain() przy odłączonych gwintach musi byćzdefiniowane ruchomości. Pytanie brzmi:gdzie (wStandard C ++, nie POSIX, a nie dokumenty OS, ...) są zdefiniowane te efekty.

2 Odłączonego wątku nie można połączyć (w sensiestd::thread::join()). tymogą poczekaj na wyniki z odłączonych wątków (np. przez przyszłość zstd::packaged_tasklub przez liczący semafor lub flagę i zmienną warunku), ale to nie gwarantuje, żewątek zakończył wykonywanie. Rzeczywiście, chyba że umieścisz część sygnalizacyjną w destruktorze pierwszego automatycznego obiektu wątkubędzieogólnie, należy uruchomić kod (destruktory)po kod sygnalizacyjny. Jeśli system operacyjny planuje główny wątek do wykorzystania wyniku i wyjścia przed odłączeniem wątku kończącego działanie wymienionych destruktorów, co będzie zdefiniowane w ^ Wis?

questionAnswers(5)

yourAnswerToTheQuestion