У меня была дискуссия с товарищем по команде о блокировке в .NET. Он действительно умный парень с обширным опытом как в программировании на низком, так и на высоком уровне, но его опыт в программировании на низком уровне намного превосходит мой. Во всяком случае, он утверждал, что следует избегать блокировки .NET в критических системах, которые, как ожидается, будут находиться под большой нагрузкой, если это вообще возможно, чтобы избежать, по общему признанию, малой вероятности сбоя системы «потоком зомби». Я обычно использую блокировку, и я не знал, что такое «нить зомби», поэтому я спросил. Из его объяснения у меня сложилось впечатление, что нить зомби - это нить, которая завершилась, но каким-то образом все еще держит некоторые ресурсы. Он привел пример того, как поток зомби может сломать систему, когда поток начинает некоторую процедуру после блокировки какого-либо объекта, и затем в какой-то момент завершается, прежде чем блокировка может быть снята. Эта ситуация может привести к сбою системы, поскольку в конечном итоге попытки выполнить этот метод приведут к тому, что все потоки будут ожидать доступа к объекту, который никогда не будет возвращен, поскольку поток, использующий заблокированный объект, мертв.
Я думаю, что понял суть этого, но если я не в базе, пожалуйста, дайте мне знать. Концепция имела смысл для меня. Я не был полностью убежден, что это реальный сценарий, который может произойти в .NET. Раньше я никогда не слышал о «зомби», но я признаю, что программисты, которые глубоко работали на более низких уровнях, как правило, имеют более глубокое понимание основ вычислительной техники (например, многопоточности). Однако я определенно вижу значение в блокировке, и я видел, как многие программисты мирового класса используют блокировку. У меня также есть ограниченные возможности оценить это для себя, потому что я знаю, что это lock(obj)
утверждение является просто синтаксическим сахаром для:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
а потому Monitor.Enter
и Monitor.Exit
помечены extern
. Представляется вероятным, что .NET выполняет какую-то обработку, которая защищает потоки от воздействия системных компонентов, которые могут оказать такое влияние, но это чисто умозрительный и, вероятно, просто основанный на том факте, что я никогда не слышал о «потоках зомби» перед. Итак, я надеюсь, что я могу получить некоторую обратную связь по этому вопросу здесь:
- Есть ли более четкое определение «нити зомби», чем то, что я объяснил здесь?
- Могут ли зомби-потоки появляться в .NET? (Почему, почему нет?)
- Если применимо, как я могу форсировать создание потока зомби в .NET?
- Если применимо, как я могу использовать блокировку, не рискуя сценарием потока зомби в .NET?
Обновить
Я задал этот вопрос чуть более двух лет назад. Сегодня это произошло:
wait
или waitpid
. Дочерний процесс тогда называется "процессом зомби". Смотрите также howtogeek.com/119815