Supongamos que estoy iniciando un std::thread
y luego detach()
, por lo que el hilo continúa ejecutándose a pesar de std::thread
que el que una vez lo representó, queda fuera de alcance.
Suponga además que el programa no tiene un protocolo confiable para unir el hilo separado 1 , por lo que el hilo separado aún se ejecuta cuando main()
sale.
No puedo encontrar nada en el estándar (más precisamente, en el borrador N3797 C ++ 14), que describe lo que debería suceder, ni 1.10 ni 30.3 contienen palabras pertinentes.
1 Otra pregunta, probablemente equivalente, es: "¿se puede volver a unir un subproceso separado?", Ya que sea cual sea el protocolo al que se va a unir, la parte de señalización debe realizarse mientras el subproceso todavía se está ejecutando, y el programador del sistema operativo puede decida poner el hilo en reposo durante una hora justo después de que se haya realizado la señalización, sin que el receptor pueda detectar de manera confiable que el hilo realmente terminó.
Si quedarse sin main()
hilos desconectados en ejecución es un comportamiento indefinido, entonces cualquier uso de este std::thread::detach()
es un comportamiento indefinido a menos que el hilo principal nunca salga 2 .
Por lo tanto, quedarse sin main()
hilos separados que se ejecutan debe tener efectos definidos . La pregunta es: dónde (en el estándar C ++ , no POSIX, no documentos del sistema operativo, ...) se definen esos efectos.
2 No se puede unir un hilo separado (en el sentido de std::thread::join()
). Usted puede esperar los resultados de las discusiones separadas (por ejemplo a través de un futuro a partir de std::packaged_task
, o por un semáforo contador o una bandera y una variable de condición), pero eso no garantiza que el mensaje ha terminado de ejecutarse . De hecho, a menos que poner la parte de señalización en el destructor del primer objeto automático del hilo, no será , en general, ser de código (destructores) que se ejecutan después de que el código de señalización. Si el sistema operativo programa el hilo principal para consumir el resultado y salir antes de que el hilo separado termine de ejecutar dichos destructores, ¿qué definirá ^ Wis para que suceda?
std::exit
o salir demain
es suficiente, pero no necesario, para satisfacer estos requisitos". (todo el párrafo puede ser relevante) Consulte también [support.start.term] / 8 (std::exit
se llama cuando semain
devuelve)