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