2012-01-25 19 views
14

basura tengo el siguiente código:nuevo hilo() y Colección

new Thread(new ThreadStart(delegate() 
{ 
    while (true) 
    { 
     //something 
    } 
})).Start(); 

Puede recolector de basura finalizar este ejemplo de Thread mientras está en el estado Running?

Respuesta

21

El CLR realiza un seguimiento de todos los subprocesos en ejecución. Siempre que haya referencias a objetos, no serán basura. Y dado que el CLR mantiene una referencia a todos los hilos en ejecución, el GC no los tocará.

13

No; los hilos de ejecución cuentan como raíces. No se recopilará un subproceso en ejecución, ni se hará referencia a los elementos activos de la pila para ese subproceso.

+0

_los hilos circulares cuentan como raíces _ _ o _referencias (dentro de un hilo) cuya referencia a objetos cuenta como raíces .._? –

+0

@Royi roots: básicamente, los locales de la pila. Tenga en cuenta que arg0 (también conocido como este) por lo general mantendrá la instancia de destino activa también –

+0

Entonces, ¿está mal/está bien decir: _GC no tiene permiso para recopilar un thread_ en ejecución? –

2

El hilo no se recogerá, porque cada hilo en ejecución, en espera o suspendido es utilizado por el GC para decidir qué está vivo (rastrear todo en la pila de cada hilo, rastrear todo lo referido por todos esos objetos, luego todo referenciado por esos, y así sucesivamente, y usted ha identificado todo lo que no puede ser basura recolectada).

El subproceso podría finalizar, si se tratara de un hilo de fondo, porque luego se cerrará activamente cuando finalicen todos los demás hilos del proceso. De lo contrario, lo único que hará que se muera es que el proceso se cierre de forma activa, una excepción (que incluye ThreadAbortException) o que salga del propio bucle while.

Hay un caso que es comparable en cierto modo, que puede ser lo que usted está pensando:

var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5)); 
int someResult = doingSomethingElse(); 
doSomethingElseThatTakesLongerThan5Seconds(); 

Esta es otra pieza de código que es causa de otro hilo de ejecución para hacer algo. En este caso, el temporizador puede ser recolector de basura antes de la ejecución, durante una de las ejecuciones, o prácticamente en cualquier momento después de que el constructor regrese.

Lo importante aquí es que no hay un hilo individual para el temporizador, y el hilo ni siquiera "sabe" sobre el objeto del temporizador. Dado que el último acceso del objeto ha sucedido desde entonces, es elegible para la recopilación. Esto es diferente a la cuestión de un hilo individual que se está ejecutando (o esperando, etc.).

Cuestiones relacionadas