Eu estava tendo uma discussão com um colega de equipe sobre o bloqueio no .NET. Ele é um cara realmente 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 inferior 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 possibilidade reconhecidamente pequena de um "encadeamento zumbi" travar um sistema. Eu costumo usar o bloqueio e não sabia o que era um "fio de zumbi", então perguntei. A impressão que tive da explicação dele é que um thread de zumbi foi encerrado, mas de alguma forma ainda mantém alguns recursos. Ele deu um exemplo de como um encadeamento de zumbis poderia quebrar um sistema, quando um encadeamento inicia algum procedimento após o bloqueio de algum objeto, e, em algum momento, é encerrado antes que o bloqueio possa ser liberado. Essa situação tem o potencial de travar o sistema, porque, eventualmente, as tentativas de executar esse método resultarão nos threads aguardando acesso a um objeto que nunca será retornado, porque o thread que está usando o objeto bloqueado está morto.
Eu acho que entendi tudo, mas se eu estiver fora da base, por favor me avise. O conceito fez sentido para mim. Eu não estava completamente convencido de que esse 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 em níveis mais baixos tendem a ter uma compreensão mais profunda dos fundamentos da computação (como o threading). Definitivamente, vejo o valor do bloqueio, e já vi muitos programadores de classe mundial alavancarem o bloqueio. Também tenho capacidade limitada de avaliar isso por mim mesmo, porque sei que a lock(obj)
afirmação é realmente apenas um 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 porque Monitor.Enter
e Monitor.Exit
são marcados extern
. Parece concebível que o .NET faça algum tipo de processamento que proteja os threads da exposição a componentes do sistema que possam ter esse tipo de impacto, mas isso é puramente especulativo e provavelmente apenas com base no fato de que eu nunca ouvi falar de "threads de zumbis" antes. Então, espero obter algum feedback sobre isso aqui:
- Existe uma definição mais clara de um "fio de zumbi" do que eu expliquei aqui?
- Threads zumbis podem ocorrer no .NET? (Porque porque não?)
- Se aplicável, como forçar a criação de um thread zumbi no .NET?
- Se aplicável, como posso aproveitar o bloqueio sem arriscar um cenário de encadeamento de zumbis no .NET?
Atualizar
Eu fiz essa pergunta há pouco mais de dois anos. Hoje isso aconteceu:
wait
ou waitpid
. O processo filho é então chamado de "processo zumbi". Veja também howtogeek.com/119815