У меня была дискуссия с товарищем по команде о блокировке в .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?
Update
Я задал этот вопрос чуть более двух лет назад. Сегодня это произошло: