Do zombies exist … in .NET?

Rozmawiałem z kolegą z zespołu o blokowaniu w .NET. Jest naprawdę bystrym facetem z bogatym doświadczeniem w programowaniu na niższym i wyższym poziomie, ale jego doświadczenie w programowaniu na niższym poziomie znacznie wykracza poza moje. W każdym razie twierdził, że należy unikać blokowania .NET w krytycznych systemach, które mogą być w dużym stopniu obciążone, jeśli w ogóle jest to możliwe, aby uniknąć wprawdzie niewielkiej możliwości „zawieszenia wątku” w systemie. Rutynowo używam blokady i nie wiedziałem, co to jest „wątek zombie”, więc zapytałem. Wrażenie, jakie dostałem z jego wyjaśnienia, jest takie, że wątek zombie jest wątkiem, który zakończył się, ale jakoś nadal trzyma pewne zasoby. Przykładem, który podał, jak wątek zombie może złamać system, jest wątek, który rozpoczyna pewną procedurę po zablokowaniu jakiegoś obiektu, a następnie jest w pewnym momencie zakończony przed zwolnieniem blokady. Ta sytuacja może spowodować awarię systemu, ponieważ w końcu próby wykonania tej metody spowodują, że wątki będą oczekiwać na dostęp do obiektu, który nigdy nie zostanie zwrócony, ponieważ wątek, który używa zablokowanego obiektu, jest martwy.

Wydaje mi się, że zrozumiałem to, ale jeśli nie jestem w bazie, daj mi znać. Ta koncepcja miała dla mnie sens. Nie byłem do końca przekonany, że jest to prawdziwy scenariusz, który może się zdarzyć w .NET. Nigdy wcześniej nie słyszałem o „zombie”, ale zdaję sobie sprawę, że programiści, którzy pracowali dogłębnie na niższych poziomach, mają głębsze zrozumienie podstaw komputerowych (takich jak wątkowanie). Zdecydowanie widzę jednak wartość blokowania i widziałem wielu programistów światowej klasy, którzy wykorzystują blokowanie. Mam również ograniczoną zdolność oceniania tego dla siebie, ponieważ wiem, żelock(obj) instrukcja jest tak naprawdę tylko składniowym cukrem dla:

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

i ponieważMonitor.Enter iMonitor.Exit są zaznaczoneextern. Można sobie wyobrazić, że .NET wykonuje pewnego rodzaju przetwarzanie, które chroni wątki przed narażeniem na komponenty systemowe, które mogłyby mieć taki wpływ, ale jest to czysto spekulatywne i prawdopodobnie oparte na fakcie, że nigdy nie słyszałem o „wątkach zombie” przed. Mam nadzieję, że mogę uzyskać tutaj kilka informacji zwrotnych:

Czy istnieje wyraźniejsza definicja „nici zombie” niż to, co tu wyjaśniłem?Czy wątki zombie występują w .NET? (Dlaczego? Dlaczego nie?)Jeśli dotyczy, w jaki sposób można wymusić utworzenie wątku zombie w .NET?Jeśli dotyczy, w jaki sposób mogę wykorzystać blokowanie bez ryzyka wystąpienia scenariusza wątku zombie w .NET?Aktualizacja

Zadałem to pytanie nieco ponad dwa lata temu. Dzisiaj tak się stało:

questionAnswers(1)

yourAnswerToTheQuestion