¿Qué sucede con un subproceso separado cuando main () sale?

Supongamos que estoy empezando unstd::thread y entoncesdetach() así, el hilo continúa ejecutándose aunque elstd::thread Que una vez lo representó, queda fuera de alcance.

Supongamos además que el programa no tiene un protocolo confiable para unirse al hilo separado1, por lo que el hilo separado todavía se ejecuta cuandomain() salidas

No puedo encontrar nada en la norma (más precisamente, en el borrador N3797 C ++ 14), que describe lo que debería suceder, ni 1.10 ni 30.3 contienen la redacción pertinente.

1 Otra pregunta, probablemente equivalente, es: "¿se puede unir nuevamente un subproceso separado", ya que cualquiera que sea el protocolo que esté inventando para unirse, la parte de señalización debería realizarse mientras el subproceso aún estaba en ejecución, y el programador del sistema operativo podría decidir? para poner el hilo en reposo durante una hora justo después de que se realizó la señalización sin que el extremo receptor detecte de manera confiable que el hilo realmente terminó.

Si se está quedando sinmain() con subprocesos que se ejecutan es un comportamiento indefinido, entoncesalguna uso destd::thread::detach() es un comportamiento indefinido a menos que el hilo principal nunca salga2.

Así, quedándose sinmain() con hilos sueltos en ejecución debe tenerdefinido efectos La pregunta es:dónde (en elEstándar de C ++, no POSIX, no documentos de SO, ...) son los efectos definidos.

2 Un hilo separado no se puede unir (en el sentido destd::thread::join()). Túpuede espere los resultados de los hilos separados (por ejemplo, a través de un futuro destd::packaged_task, o por un semáforo de recuento o una bandera y una variable de condición), pero eso no garantiza que elel hilo ha terminado de ejecutarse. De hecho, a menos que coloque la parte de señalización en el destructor del primer objeto automático del hilo, habráserá, en general, ser código (destructores) que se ejecutandespués El código de señalización. Si el sistema operativo programa el subproceso principal para que consuma el resultado y salga antes de que el subproceso finalice la ejecución de dichos destructores, ¿qué se va a definir?

Respuestas a la pregunta(5)

Su respuesta a la pregunta