Do zombies exist … in .NET?

У меня была дискуссия с товарищем по команде о блокировке в .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?Обновить

Я задал этот вопрос чуть более двух лет назад. Сегодня это произошло:

Ответы на вопрос(6)

Ваш ответ на вопрос