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

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

Предположим далее, что программа не имеет надежного протокола для присоединения к отдельному потоку1таким образом, отсоединенный поток все еще работает, когдаmain() выходы.

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

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

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

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

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

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

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