Что происходит с отдельным потоком при выходе из 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?