Saya sedang berdiskusi dengan rekan tim tentang mengunci .NET. Dia orang yang sangat cerdas dengan latar belakang yang luas dalam pemrograman level rendah dan level tinggi, tetapi pengalamannya dengan pemrograman level bawah jauh melebihi milikku. Lagi pula, Dia berpendapat bahwa .NET locking harus dihindari pada sistem kritis yang diharapkan berada di bawah beban berat jika mungkin untuk menghindari kemungkinan kecil dari "utas zombie" menabrak sistem. Saya secara rutin menggunakan penguncian dan saya tidak tahu apa itu "zombie thread", jadi saya bertanya. Kesan yang saya dapatkan dari penjelasannya adalah bahwa utas zombie adalah utas yang telah berakhir tetapi entah bagaimana masih berpegang pada beberapa sumber. Sebuah contoh yang dia berikan tentang bagaimana sebuah thread zombie dapat merusak suatu sistem adalah sebuah thread memulai beberapa prosedur setelah mengunci suatu objek, dan kemudian di beberapa titik diakhiri sebelum kunci dapat dilepaskan. Situasi ini berpotensi merusak sistem, karena pada akhirnya, upaya untuk mengeksekusi metode itu akan menghasilkan semua utas menunggu akses ke objek yang tidak akan pernah dikembalikan, karena utas yang menggunakan objek terkunci sudah mati.
Saya pikir saya mendapatkan intinya, tetapi jika saya tidak berada di tempat, tolong beri tahu saya. Konsep itu masuk akal bagi saya. Saya tidak sepenuhnya yakin bahwa ini adalah skenario nyata yang dapat terjadi di .NET. Saya belum pernah mendengar tentang "zombie", tetapi saya mengakui bahwa programmer yang telah bekerja secara mendalam di level yang lebih rendah cenderung memiliki pemahaman yang lebih dalam tentang dasar-dasar komputasi (seperti threading). Saya benar-benar melihat nilai dalam penguncian, dan saya telah melihat banyak pemrogram kelas dunia memanfaatkan penguncian. Saya juga memiliki kemampuan terbatas untuk mengevaluasi ini untuk diri saya sendiri karena saya tahu bahwa lock(obj)
pernyataan itu sebenarnya hanya gula sintaksis untuk:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
dan karena Monitor.Enter
dan Monitor.Exit
ditandai extern
. Tampaknya dibayangkan bahwa .NET melakukan beberapa jenis pemrosesan yang melindungi utas dari paparan komponen sistem yang dapat memiliki dampak seperti ini, tetapi itu murni spekulatif dan mungkin hanya berdasarkan pada fakta bahwa saya belum pernah mendengar tentang "utas zombie" sebelum. Jadi, saya berharap saya bisa mendapatkan umpan balik tentang ini di sini:
- Apakah ada definisi yang lebih jelas tentang "utas zombie" daripada yang saya jelaskan di sini?
- Bisakah thread zombie muncul di .NET? (Kenapa / Mengapa tidak?)
- Jika berlaku, Bagaimana saya bisa memaksa pembuatan utas zombie di .NET?
- Jika berlaku, Bagaimana cara memanfaatkan penguncian tanpa risiko skenario untaian zombie di .NET?
Memperbarui
Saya mengajukan pertanyaan ini lebih dari dua tahun yang lalu. Hari ini terjadi:
wait
atau waitpid
. Proses anak ini kemudian disebut "proses zombie". Lihat juga howtogeek.com/119815