tutorial - Vida de objeto de hilo C#
threadstart c# (4)
Supongamos que tengo un código de la siguiente manera:
int Main()
{
if (true)
{
new Thread(()=>
{
doSomeLengthyOperation();
}).Start();
}
while (true)
{
//do nothing
}
}
Hay 2 subprocesos, voy a llamar al subproceso principal el subproceso que está ejecutando la función Main () y el subproceso que se está iniciando dentro de la prueba "if" como Subproceso A.
Mi pregunta es, ¿cuándo se destruye el hilo A? ¿DoSomeLenghtyOperation () podrá ejecutarse?
Dado que no hay referencias que apunten al Subproceso A, ¿se marcará como candidato para la recolección de basura?
- Inmediatamente después de que finalice el enunciado "new Thread (). Start ()"?
- ¿Inmediatamente después de que se sale del alcance "si (verdadero)"?
- ¿Después de que doSomeLengthOperation () se ejecuta para finalizar?
- ¿Nunca?
Todos los ejemplos que veo son Main () que contiene la referencia, y luego el hilo principal que espera unirse con el hilo A antes de salir. Tengo curiosidad por la vida útil del código anterior.
¡Gracias por adelantado!
¿Cuándo se destruye el hilo A?
Cuando finaliza doSomeLengthyOperation
.
¿DoSomeLenghtyOperation () podrá ejecutarse hasta completarse?
Sí, incluso si el hilo principal existe porque no es un hilo de fondo. Si establece la propiedad IsBackground en true
antes de iniciar el subproceso siempre que exista el subproceso principal, este subproceso también se detendrá.
¡Esta es una excelente pregunta! El hilo seguramente terminará y puedes probarlo tú mismo. Pero puede ser interesante si llama a GC.Collect () mientras tanto. De acuerdo con C # de Richter a través de CLR, será recogida de basura.
ACTUALIZAR
Creo que no será recolectado en la basura ya que Thread.CurrentThread lo guarda en la memoria al tener una referencia.
El objeto Thread
será elegible para la recolección de basura tan pronto como no se use más, es decir, inmediatamente después de llamar al método Start
. (Sin embargo, no se recolectará de inmediato, ya que el recolector de basura se ejecuta en momentos específicos).
Sin embargo, el subproceso real no depende del objeto Thread
y continuará ejecutándose incluso si se recopila el objeto Thread
.
Si el subproceso aún se está ejecutando cuando el método principal sale, la aplicación no finalizará hasta que el subproceso se complete, a menos que haya marcado el subproceso como un subproceso de fondo.
Palabra "hilo" podría significar varias cosas aquí:
- Objeto System.Threading.Thread (creado por el
new Thread()
), - Hilo CLR (hilo gestionado),
- Hilo del sistema operativo (hilo no gestionado).
El objeto Thread será candidato para GC tan pronto como se complete el método Start (), porque no hay más referencias a él.
El hilo administrado permanecerá vivo mientras se ejecuta doSomeLengthyOperation ().
Citando el article de James Kovacs, Microsoft MVP:
La vida útil de un hilo administrado es independiente del objeto Thread que lo crea, algo muy bueno dado que no querría que el GC termine un hilo que aún estaba funcionando simplemente porque perdió todas las referencias al objeto Thread asociado. Así que el GC está recolectando el objeto Thread, pero no el thread administrado real.
El artículo también contiene algunos ejemplos de código útiles si desea experimentar usted mismo.
El hilo del sistema operativo, teóricamente, no tiene una relación de uno a uno con los hilos administrados. Desde MSDN :
... un host sofisticado puede usar la API de alojamiento de CLR para programar muchos subprocesos administrados contra el mismo subproceso del sistema operativo, o para mover un subproceso administrado entre los diferentes subprocesos del sistema operativo.
En la práctica, sin embargo, el hilo CLR se asigna directamente a un hilo de Windows hoy .