SORU
19 Kasım 2013, Salı


Zombiler ... var .NET?

Kilitleme hakkında bir takım arkadaşı ile bir tartışma vardı .NET. Alt düzey ve üst düzey hem de programlama konusunda geniş bir arka plan ile çok parlak bir adam, ama daha düşük seviye programlama deneyimi benimkinden aşıyor. Neyse, savundu .NET kilitleme kritik sistemleri "zombi parçacığı" sistemi çöküyor. bir kuşkusuz küçük olasılığı önlemek için ağır yük mümkünse altında olması beklenen kaçınılmalıdır Ben düzenli olarak kullanın kilitleme ve ne olduğunu bilmiyordum bir "zombi iplik sordum" oldu. Onun açıklaması aldığım izlenim zombi parçacığı sona erdi ama nedense hala bazı kaynaklar üzerine tutan bir konu. Verdiği bir örnek, iş parçacığı bir sistem zarar verebilir zombi bir konu ne kadar bazı nesne kilitleme sonra bazı prosedür başlar ve sonra bir noktada kilit serbest bırakılabilir önce sonlandırıldı. Bu durum potansiyel kilitlenme sistemi, çünkü sonunda, girişimleri için idam yöntemi olacak sonucu tüm konuları bekliyorum erişmek için bir nesne asla geri döndü, çünkü bu iş parçacığı kullanarak kilitli nesne öldü.

Bu ana fikrini anladım sanırım, ama eğer ben yanılıyorsam eğer, lütfen bana bildirin. Bu kavram benim için mantıklıydı. Bu başına gelebilecek gerçek bir senaryo olduğuna tamamen ikna olmuş değildim .NET. Daha önce hiç duymadım "zombiler", ama ben daha düşük seviyelerde derinlemesine çalışmış programcılar hesaplama temelleri daha derin bir anlayışa sahip olma eğilimindedir kabul edilen bir şey (diş gibi). Kesinlikle kilitleme değeri, ancak görüyor ve birçok dünya standartlarında programcılar kaldıraç kilitleme gördüm. Ben de lock(obj) deyimi gerçekten sadece sözdizimsel şeker olduğunu biliyorum çünkü kendim için bu değerlendirme yeteneği sınırlı

bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }

ve Monitor.Enter Monitor.Exit extern işaretli olduğundan. Akla yatkın gibi görünüyor .NET yapar bir çeşit işleme koruyan iş parçacığı maruz sistem bileşenleri kullanılabilecek bu tür bir etki, ama bu tamamen spekülatif ve muhtemelen gerçeğine dayanarak daha önce hiç duymadım "zombi konuları" önce. Yani, bu konuda biraz geri gel bekliyorum:

  1. Daha net bir tanımı "iplik daha burada açıkladım ne"? zombi var
  2. Zombi konuları üzerinde oluşabilir .NET? (Niçin/Neden?)
  3. Varsa, Nasıl bir zombi parçacığı oluşturma yürürlükte olabilir .NET?
  4. Varsa, Nasıl kaldıraç zombi parçacığı bir senaryoda riske atmadan kilitleme edebilirim .NET?

CEVAP
19 Kasım 2013, Salı


  • Daha net bir tanımı "iplik daha burada açıkladım ne"? zombi var

Görünüşe göre oldukça iyi bir açıklama için bana bir iplik olan biten (ve bu nedenle artık bırakın herhangi bir kaynak), ama olan kaynaklar (örneğin kolları) hala buralarda ve (olası) sorunlara neden olan.

  • Zombi konuları üzerinde oluşabilir .NET? (Niçin/Neden?)
  • Varsa, Nasıl bir zombi parçacığı oluşturma yürürlükte olabilir .NET?

Öyle tabii, bakın, ben bir tane yaptım!

[DllImport("kernel32.dll")]
private static extern void ExitThread(uint dwExitCode);

static void Main(string[] args)
{
    new Thread(Target).Start();
    Console.ReadLine();
}

private static void Target()
{
    using (var file = File.Open("test.txt", FileMode.OpenOrCreate))
    {
        ExitThread(0);
    }
}

Bu program bir iş parçacığı bir dosya açar Target başlar ve daha sonra hemen kendini ExitThread kullanarak öldürür.Sonuçta zombi iplik asla "" ve böylece dosyayı sonlandırır (işlem Gezgini veya benzer kontrol edebilirsiniz) programı. kadar açık kalacak dosya test.txt için kolu serbest bırakacak"Test.txt" yayınlanmayacak GC.Collect kadar - düşündüğümden daha zor sızıntıları işleyen zombi bir iş parçacığı oluşturma) olduğu ortaya çıktı . tanıtıcı

  • Varsa, Nasıl kaldıraç zombi parçacığı bir senaryoda riske atmadan kilitleme edebilirim .NET?

Ben ne yaptım böyle yapma!

Sürece kodunuzu temizler sonra kendisini doğru (Safe Handles veya eşdeğer dersleri eğer çalışma ile yönetilmeyen kaynakları), ve sürece sen sakın dışarı çıkma yolu öldürmek konuları garip ve harika yollar (en güvenli yoldur sadece asla öldürmek konuları - izin sona kendilerini normalde, veya özel durumlar gerekiyorsa), tek yol sensin yapacak bir şey andıran bir zombi konu ise bir şey kalmadıçokyanlış (örneğin, yanlış bir şey CLR kadar gider.

Aslında onun zombi bir iş parçacığı oluşturmak için aslında oldukça zor (P esentially bildiren bir işlev Çağırmak/C dışında aramak değil belgelerinde vardı). Örneğin (korkunç) aşağıdaki kodu aslında zombi bir iş parçacığı oluşturmak değil.

static void Main(string[] args)
{
    var thread = new Thread(Target);
    thread.Start();
    // Ugh, never call Abort...
    thread.Abort();
    Console.ReadLine();
}

private static void Target()
{
    // Ouch, open file which isn't closed...
    var file = File.Open("test.txt", FileMode.OpenOrCreate);
    while (true)
    {
        Thread.Sleep(1);
    }
    GC.KeepAlive(file);
}

Rağmen bazı oldukça korkunç hatalar işlemek "test.txt" hala kapalı en kısa sürede Abort (bir parçası olarak, sonlandırıcı file hangi yorganın altında kullanır SafeFileHandle wrap dosya tanıtıcı)

Kilitleme örnekte C.Evenhuis answer muhtemelen en kolay yolu başarısız serbest bırakmak için bir kaynak (bir kilit bu durumda) ne zaman bir iş parçacığı sona erdirildi olmayan garip bir yol, ama bu kolayca sabit ya da kullanarak bir lock deyimi yerine, ya da koyarak sürümü finally blok.

Ayrıca Bkz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8bitdigitaltv

    8bitdigitalt

    31 AĞUSTOS 2011
  • Dive In

    Dive In

    17 Temmuz 2013
  • infodirt

    infodirt

    11 Mart 2009

İLGİLİ SORU / CEVAPLAR