Что происходит с отдельным потоком при выходе из main ()?

Предположим, я начинаюstd::thread а потомdetach() это, поэтому поток продолжает выполняться, хотяstd::thread что когда-то это представляло, выходит за рамки.

$4 а потом5$main() выходы.

Я не могу найти ничего в стандарте (точнее, в проекте N3797 C ++ 14), который описывает, что должно произойти, ни 1.10, ни 30.3 не содержат соответствующих формулировок.

1 Другой, возможно, эквивалентный вопрос: «можно ли когда-нибудь снова присоединить отсоединенный поток», потому что к какому бы протоколу вы ни придумали присоединиться, сигнальная часть должна была быть выполнена, пока поток еще работал, и планировщик ОС мог бы решить перевести поток в спящий режим на час сразу после того, как была выполнена сигнализация, и принимающая сторона не сможет надежно определить, что поток действительно завершен.

Если заканчиваетсяmain() при работе с отдельными потоками неопределенное поведение, тоЛюбые использованиеstd::thread::detach() не определено поведение, если основной поток никогда не выходит2.

Таким образом, изmain() с запущенными потоками должны иметьопределенный последствия. Вопрос в том:где (вСтандарт C ++, а не POSIX, не ОС документы, ...) эти эффекты определены.

2 Отдельная нить не может быть присоединена (в смыслеstd::thread::join()). ВыМожно ждать результатов от отдельных тем (например, через будущее отstd::packaged_taskили счетным семафором или флагом и условной переменной), но это не гарантирует, чтопоток завершил выполнение, Действительно, если вы не поместите сигнальную часть в деструктор первого автоматического объекта потока,будем, в общем, быть кодом (деструкторами), которые запускаютсяпосле код сигнализации. Если ОС планирует основной поток использовать результат и завершить работу до того, как отдельный поток завершит работу с указанными деструкторами, что будет определяться ^ W?

Ответы на вопрос(5)

Ваш ответ на вопрос