Do zombies exist … in .NET?

Eu estava tendo uma discussão com um colega de equipe sobre o bloqueio no .NET. Ele é um cara muito brilhante, com uma extensa experiência em programação de nível inferior e superior, mas sua experiência com programação de nível mais baixo excede em muito a minha. De qualquer forma, Ele argumentou que o bloqueio do .NET deve ser evitado em sistemas críticos que devem estar sob carga pesada, se possível, a fim de evitar a pequena possibilidade de um "zumbi thread" derrubar um sistema. Eu costumo usar bloqueio e eu não sabia o que era um "fio zumbi", então eu perguntei. A impressão que recebi de sua explicação é que um segmento de zumbi é um segmento que terminou, mas de alguma forma ainda mantém alguns recursos. Um exemplo que ele deu de como um thread zumbi poderia quebrar um sistema era um thread começa algum procedimento após o bloqueio em algum objeto e, em seguida, é em algum momento encerrado antes que o bloqueio pode ser liberado. Essa situação tem o potencial de travar o sistema, porque, eventualmente, tentativas de executar esse método resultarão em todos os encadeamentos aguardando o acesso a um objeto que nunca será retornado, porque o encadeamento que está usando o objeto bloqueado está inativo.

Eu acho que eu tenho a essência disso, mas se eu estiver fora da base, por favor me avise. O conceito fazia sentido para mim. Eu não estava completamente convencido de que este era um cenário real que poderia acontecer no .NET. Eu nunca ouvi falar de "zumbis", mas reconheço que os programadores que trabalharam em profundidade nos níveis mais baixos tendem a ter uma compreensão mais profunda dos fundamentos da computação (como o threading). Eu definitivamente vejo o valor em bloqueio, no entanto, e eu vi muitos programadores de classe mundial aproveitarem o bloqueio. Eu também tenho capacidade limitada para avaliar isso para mim porque eu sei que olock(obj) declaração é realmente apenas açúcar sintático para:

bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }

e porqueMonitor.Enter eMonitor.Exit estão marcadosextern. Parece concebível que o .NET faça algum tipo de processamento que proteja os threads da exposição a componentes do sistema que poderiam ter esse tipo de impacto, mas isso é puramente especulativo e provavelmente apenas baseado no fato de nunca ter ouvido falar de "threads zumbis" antes. Então, eu estou esperando que eu possa obter algum feedback sobre isso aqui:

Existe uma definição mais clara de um "thread de zumbis" do que o que expliquei aqui?Os encadeamentos de zumbis podem ocorrer no .NET? (Porque porque não?)Se aplicável, como eu poderia forçar a criação de um segmento de zumbis no .net?Se aplicável, Como posso aproveitar o bloqueio sem arriscar um cenário de thread de zumbis no .NET?Atualizar

Eu fiz essa pergunta um pouco mais de dois anos atrás. Hoje isso aconteceu:

questionAnswers(1)

yourAnswerToTheQuestion