Considere el siguiente programa C #, lo envié en codegolf como respuesta para crear un bucle sin bucle:
class P{
static int x=0;
~P(){
System.Console.WriteLine(++x);
new P();
}
static void Main(){
new P();
}
}
Este programa parece un bucle infinito en mi inspección, pero parece ejecutarse durante varios miles de iteraciones, y luego el programa termina con éxito sin errores (no se lanzan errores). ¿Es una infracción de especificación para la que P
finalmente no se llama al finalizador ?
Claramente, este es un código estúpido, que nunca debería aparecer, pero tengo curiosidad por saber cómo podría completarse el programa.
Código original de la publicación de golf: /codegolf/33196/loop-without-looping/33218#33218
c#
garbage-collection
Michael B
fuente
fuente
Respuestas:
Según Richter en la segunda edición de CLR a través de C # (sí, necesito actualizar):
Página 478
Además, como menciona Servy, tiene su propio hilo.
fuente
El finalizador no se ejecuta en el hilo principal. El finalizador tiene su propio subproceso que ejecuta código, y no es un subproceso en primer plano que mantendría la aplicación en ejecución. El hilo principal se completa de forma efectiva de inmediato, momento en el que el hilo del finalizador simplemente se ejecuta tantas veces como tenga la oportunidad antes de que el proceso se detenga. Nada mantiene vivo el programa.
fuente
Un recolector de basura no es un sistema activo. Se ejecuta "a veces" y principalmente a pedido (por ejemplo, cuando todas las páginas que ofrece el sistema operativo están llenas).
La mayoría de los recolectores de basura se ejecutan de manera similar a la primera generación en un subproceso. En la mayoría de los casos, pueden pasar horas antes de que el objeto se recicle.
El único problema ocurre cuando desea terminar el programa. Sin embargo, eso no es realmente un problema. Cuando utilice
kill
un sistema operativo le pedirá cortésmente que finalice los procesos. Sin embargo, cuando el proceso permanece activo, se puede usarkill -9
donde el sistema operativo elimina todo el control.Cuando ejecuté su código en el
csharp
entorno interactivo , obtuve:Por lo tanto, su programa se bloquea porque
stdout
está bloqueado por la terminación del entorno.Al eliminar
Console.WriteLine
y matar el programa. Después de cinco segundos, el programa termina (en otras palabras, el recolector de basura se rinde y simplemente liberará toda la memoria sin tener en cuenta a los finalizadores).fuente
P
instancia simplemente agotó el tiempo de espera.