Estaba teniendo una discusión con un compañero de equipo sobre bloquear en .NET. Es un tipo realmente brillante con una amplia experiencia tanto en programación de nivel inferior como de nivel superior, pero su experiencia con la programación de nivel inferior supera con creces la mía. De todos modos, argumentó que el bloqueo de .NET debe evitarse en los sistemas críticos que se espera que estén sometidos a una gran carga, si es posible, para evitar la pequeña posibilidad de que un "hilo zombie" estrelle un sistema. Usualmente uso el bloqueo y no sabía qué era un "hilo zombie", así que pregunté. La impresión que obtuve de su explicación es que un hilo zombie es un hilo que ha terminado pero que de alguna manera aún conserva algunos recursos. Un ejemplo que dio de cómo un hilo zombie podría romper un sistema fue que un hilo comienza un procedimiento después de bloquear un objeto, y luego termina en algún momento antes de que se pueda liberar el bloqueo. Esta situación tiene el potencial de bloquear el sistema, porque eventualmente, los intentos de ejecutar ese método darán como resultado que todos los hilos esperen el acceso a un objeto que nunca será devuelto, porque el hilo que está usando el objeto bloqueado está muerto.
Creo que entendí la esencia de esto, pero si estoy fuera de la base, por favor hágamelo saber. El concepto tenía sentido para mí. No estaba completamente convencido de que este fuera un escenario real que podría suceder en .NET. Nunca antes había oído hablar de "zombis", pero sí reconozco que los programadores que han trabajado en profundidad en los niveles inferiores tienden a tener una comprensión más profunda de los fundamentos de la informática (como el subprocesamiento). Sin embargo, definitivamente veo el valor en el bloqueo, y he visto a muchos programadores de clase mundial aprovechar el bloqueo. También tengo una capacidad limitada para evaluar esto por mí mismo porque sé que la lock(obj)
declaración es realmente solo azúcar sintáctica para:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
y porque Monitor.Enter
y Monitor.Exit
están marcados extern
. Parece concebible que .NET realice algún tipo de procesamiento que proteja los hilos de la exposición a los componentes del sistema que podrían tener este tipo de impacto, pero eso es puramente especulativo y probablemente solo se base en el hecho de que nunca he oído hablar de "hilos de zombis" antes de. Entonces, espero poder obtener algunos comentarios sobre esto aquí:
- ¿Existe una definición más clara de "hilo zombie" que la que he explicado aquí?
- ¿Pueden aparecer hilos zombie en .NET? (¿Por qué por qué no?)
- Si corresponde, ¿cómo podría forzar la creación de un hilo zombie en .NET?
- Si corresponde, ¿cómo puedo aprovechar el bloqueo sin arriesgar un escenario de subproceso zombie en .NET?
Actualizar
Hice esta pregunta hace poco más de dos años. Hoy sucedió esto:
wait
o waitpid
. El proceso hijo se denomina "proceso zombie". Ver también howtogeek.com/119815