Rozmawiałem z kolegą z zespołu na temat blokowania w .NET. To naprawdę bystry facet z dużym doświadczeniem zarówno w programowaniu niższego, jak i wyższego poziomu, ale jego doświadczenie w programowaniu na niższym poziomie znacznie przewyższa moje. W każdym razie argumentował, że należy unikać blokowania platformy .NET w krytycznych systemach, które powinny być obciążone, o ile to w ogóle możliwe, aby uniknąć dopuszczalnej niewielkiej możliwości awarii wątku „zombie”. Rutynowo używam blokowania i nie wiedziałem, co to jest „nić zombie”, więc zapytałem. Mam wrażenie, że z jego wyjaśnienia wynika, że nić zombie to nić, która się zakończyła, ale jakoś wciąż trzyma pewne zasoby. Podał przykład, w jaki sposób nić zombie może złamać system, gdy nić rozpoczyna procedurę po zablokowaniu jakiegoś obiektu, a następnie jest w pewnym momencie zakończone 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 korzystający z zablokowanego obiektu jest martwy.
Myślę, że mam tego sedno, ale jeśli jestem poza bazą, daj mi znać. Ta koncepcja miała dla mnie sens. Nie byłem do końca przekonany, że to był prawdziwy scenariusz, który mógłby się wydarzyć 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, zwykle lepiej rozumieją podstawy obliczeń (takie jak wątki). Zdecydowanie widzę jednak wartość blokowania i widziałem wielu światowej klasy programistów korzystających z blokowania. Mam również ograniczoną zdolność do oceny tego dla siebie, ponieważ wiem, że lock(obj)
stwierdzenie to tak naprawdę tylko cukier składniowy dla:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
i ponieważ Monitor.Enter
i Monitor.Exit
są oznaczone extern
. Wydaje się możliwe, że .NET wykonuje pewien rodzaj przetwarzania, który chroni wątki przed narażeniem na komponenty systemu, które mogłyby mieć taki wpływ, ale jest to czysto spekulacyjne i prawdopodobnie oparte na fakcie, że nigdy nie słyszałem o „wątkach zombie” przed. Mam nadzieję, że uda mi się uzyskać informacje zwrotne na ten temat:
- Czy istnieje wyraźniejsza definicja „nici zombie” niż to, co tutaj wyjaśniłem?
- Czy wątki zombie mogą występować w .NET? (Dlaczego? Dlaczego nie?)
- Jeśli dotyczy, jak mogę wymusić utworzenie nici zombie w .NET?
- Jeśli dotyczy, jak mogę wykorzystać blokowanie bez ryzyka scenariusza wątku zombie w .NET?
Aktualizacja
Zadałem to pytanie nieco ponad dwa lata temu. Dziś tak się stało:
wait
lub waitpid
. Proces potomny jest następnie nazywany „procesem zombie”. Zobacz także howtogeek.com/119815