.NET'te kilitleme hakkında bir takım arkadaşıyla bir tartışma yapıyordum. Hem alt düzey hem de üst düzey programlamada geniş bir geçmişi olan gerçekten parlak bir adam, ancak daha düşük düzeyli programlama ile olan deneyimi benimkini aşıyor. Her neyse, O, bir sistemin çökmesine "zombi iplik" olasılığını önlemek için mümkün olduğunca ağır yük altında olması beklenen kritik sistemlerde .NET kilitlemeden kaçınılması gerektiğini savundu. Ben rutin kilitleme kullanın ve bir "zombi iplik" ne olduğunu bilmiyordum, bu yüzden sordum. Onun açıklamasından edindiğim izlenim, bir zombi iş parçacığının sonlandırılmış ancak bir şekilde hala bazı kaynaklara tutunan bir iş parçacığı olduğudur. Bir zombi iş parçacığının bir sistemi nasıl kırabileceğine dair bir örnek, bir iş parçacığının bir nesneye kilitlendikten sonra bazı prosedürlere başlamasıydı, ve sonra kilit açılmadan önce bir noktada sonlandırılır. Kilitli nesneyi kullanan iş parçacığı öldüğünden, sonunda, bu yöntemi yürütme girişimleri iş parçacıklarının hiçbir zaman döndürülmeyecek bir nesneye erişim için beklemesine neden olacağından, bu durum sistemin çökme potansiyeline sahiptir.
Sanırım bunun özünü aldım, ama eğer üssüm yoksa lütfen bana bildirin. Kavram bana mantıklı geldi. Bunun .NET'te gerçekleşebilecek gerçek bir senaryo olduğuna tamamen ikna olmadım. Daha önce hiç "zombileri" duymadım, ancak daha düşük seviyelerde derinlemesine çalışan programcıların, bilgisayarla ilgili temel bilgileri (iş parçacığı gibi) daha derin bir şekilde anlama eğiliminde olduklarını kabul ediyorum. Bununla birlikte, kesinlikle kilitlemenin değerini görüyorum ve birçok birinci sınıf programcının kilitlemeden yararlandığını gördüm. Ben de bunu kendim için değerlendirmek için sınırlı yeteneğim var, çünkü lock(obj)
ifadenin gerçekten sadece sözdizimsel şeker olduğunu biliyorum :
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
ve çünkü Monitor.Enter
ve Monitor.Exit
işaretlidir extern
. .NET'in, iş parçacıklarını bu tür bir etkiye sahip olabilecek sistem bileşenlerine maruz kalmaya karşı koruyan bir tür işlem gerçekleştirdiği düşünülebilir, ancak bu tamamen spekülatif ve muhtemelen sadece "zombi konuları" daha önce hiç duymadığım gerçeğe dayanıyor önce. Bu yüzden, bu konuda bazı geri bildirimler alabileceğimi umuyorum:
- "Zombi parçacığının" burada açıkladığımdan daha net bir tanımı var mı?
- .NET'te zombi konuları oluşabilir mi? (Neden / Neden olmasın?)
- Mümkünse, .NET'te bir zombi iş parçacığının oluşturulmasını nasıl zorlayabilirim?
- Mümkünse, .NET'te bir zombi iş parçacığı senaryosunu riske atmadan kilitlemeyi nasıl kullanabilirim?
Güncelleme
Bu soruyu iki yıldan biraz önce sordum. Bugün bu oldu:
wait
ya waitpid
. Alt sürece "zombi işlemi" denir. Ayrıca bkz. Howtogeek.com/119815