2011-01-12 15 views
20

Estaba haciendo algunos programas multiproceso en Visual Studio C++ utilizando las llamadas beginthreadex, endthreadex.Los subprocesos hijo salen cuando finaliza el subproceso principal

Creo un hilo hijo thread1. El subproceso secundario se ejecuta en una función que nunca sale ya que tiene un ciclo infinito. Ahora, si el hilo principal termina con error o finaliza con éxito, ¿el hilo hijo también sale? Mi duda es: ¿hay alguna situación en la que el hilo hijo esté vivo incluso después de que salga el programa principal?

Para Linux, ¿cómo debería ser este caso?

+1

Aquí hay una pregunta muy relacionada: http://stackoverflow.com/questions/2197699/is-it-necessary-to-expllicitly-stop-all-threads-prior-to-exiting-a-win32-applicati – sharptooth

+0

The la publicación tiene respuestas contradictorias. – excray

+0

@ user97642 ¿Cuáles son los conflictos desde su punto de vista? Todas las respuestas me parecen similares. –

Respuesta

31

No hay relación padre/hijo entre subprocesos. Si el hilo A crea el hilo B y luego el hilo A finaliza, el hilo B continuará ejecutándose.

La excepción a esto es cuando finaliza el hilo principal (es decir, el hilo que ejecuta la función main()). Cuando esto sucede, el proceso finaliza y todos los demás hilos se detienen.

+5

Dos excepciones. Si * any * thread llama a 'exit', entonces * todos * hilos terminan. – EML

+1

También me gustaría agregar que si 'main' existe sin llamar' detach' en el hilo en ejecución, se lanzará una excepción. – Everyone

7

Desde C y C++ mandate that returning from the main function kills all running threads, sí, el proceso debería haber desaparecido. Y dado que el comportamiento lo realiza el tiempo de ejecución, la situación debería ser la misma en Linux.

+0

El enlace que proporcionó no dice nada sobre el requisito de idioma de * matar * (!) Todos los hilos. Solo cita un requisito de que regresar de main es equivalente a llamar a exit(). –

2

Tan pronto como la muerte de tu proceso, todos los recursos están siendo liberados (memoria, los archivos y las discusiones)

la forma correcta de hacer esto: cuando se llama BeginThread, mantener el manejador devuelto en el hilo de los padres, y llame al WaitForObject antes de salir del programa (we join el subproceso principal con el subproceso secundario).

El subproceso principal se bloqueará hasta que termine el subproceso secundario. Si su hilo hijo tiene un ciclo infinito, puede definir un "punto de interrupción" y verificar si debe abandonarlo. Por ejemplo, usar una variable booleana compartida. Compruebe Interrupt Politely para más información.

+0

Su caso está bien cuando el programa normalmente termina, es decir, llega al final de main(). Pero hay muchos lugares en el hilo primario o primario que llaman a exit(). Entonces, ¿exit() mataría a todos los hilos? – excray

+0

@ user97642 Si el hilo principal sale, todos los demás hilos dejan de –

+2

Tenga en cuenta que las esperas infinitas en semáforos, controladores, etc. pueden hacer que su proceso se convierta en zombie tanto en Windows como en Linux. De lo contrario, es como dicen los demás; cuando el hilo principal muere, todos los demás mueren. – JimR

Cuestiones relacionadas