Предположим, что я запускаю std::thread
, а затем detach()
, поэтому поток продолжает выполняться, хотя std::thread
, который когда-то представлял его, выходит за рамки.
Предположим далее, что программа не имеет надежного протокола для соединения выделенного потока 1 поэтому выделенный поток все еще выполняется, когда main()
завершается.
Я не могу найти ничего в стандарте (точнее, в проекте N3797 С++ 14), в котором описывается, что должно произойти, ни 1.10, ни 30.3 не содержат соответствующей формулировки.
1 Еще один, возможно, эквивалентный вопрос: "может ли отсоединенный поток когда-либо соединяться снова", потому что любой протокол, который вы изобретаете, чтобы присоединиться, сигнальная часть должна быть выполнена, поток продолжал работать, и планировщик ОС мог решить, что поток будет спать в течение часа сразу после того, как сигнализация была выполнена без возможности для получающего конца надежно обнаружить, что поток фактически завершен.
Если выполнение main()
с отключенными потоками выполняется undefined, то любое использование std::thread::detach()
- это поведение undefined, если основной поток никогда не выходит из 2.
Таким образом, выполнение main()
с работающими отдельными потоками должно иметь определенные эффекты. Возникает вопрос: где (в стандарте С++, а не POSIX, а не OS docs,...) - это те эффекты, которые определены.
2 Отделяемая нить не может быть соединена (в смысле std::thread::join()
). Вы можете дождаться результатов от отдельных потоков (например, через будущее от std::packaged_task
, или с помощью семафора или флага и переменной условия), но это не гарантирует завершения потока. Действительно, если вы не поместите сигнальную часть в деструктор первого автоматического объекта потока, в общем случае будет код (деструкторы), который запускается после кода сигнализации. Если ОС расписала основной поток, чтобы потреблять результат и выйти до того, как отсоединенный поток завершит выполнение указанных деструкторов, что будет определяться?