ฉันมีการพูดคุยกับเพื่อนร่วมทีมเกี่ยวกับการล็อคใน. NET เขาเป็นคนที่สดใสจริงๆมีภูมิหลังที่กว้างขวางทั้งในระดับล่างและระดับสูงกว่าการเขียนโปรแกรม แต่ประสบการณ์ของเขาในการเขียนโปรแกรมระดับล่างต่ำกว่าของฉัน อย่างไรก็ตามเขาแย้งว่าการล็อค. NET ควรหลีกเลี่ยงในระบบที่มีความสำคัญซึ่งคาดว่าจะอยู่ภายใต้ภาระหนักหากเป็นไปได้ทั้งหมดเพื่อหลีกเลี่ยงความเป็นไปได้เล็กน้อยของ "zombie thread" ที่ล้มเหลวของระบบ ฉันใช้การล็อคเป็นประจำและฉันไม่รู้ว่า "zombie thread" คืออะไรฉันจึงถาม ความประทับใจที่ฉันได้รับจากคำอธิบายของเขาก็คือว่าซอมบี้เป็นเธรดที่ถูกยกเลิก แต่ก็ยังมีทรัพยากรบางอย่างอยู่ ตัวอย่างที่เขายกให้วิธีที่เธรด zombie สามารถทำให้ระบบแตกได้เธรดจะเริ่มโพรซีเดอร์หลังจากล็อกวัตถุบางตัว จากนั้นจะถึงจุดสิ้นสุดก่อนที่จะสามารถปลดล็อคได้ สถานการณ์นี้มีโอกาสที่จะเกิดความผิดพลาดของระบบเพราะในที่สุดความพยายามที่จะดำเนินการวิธีการจะส่งผลให้เธรดทั้งหมดกำลังรอการเข้าถึงวัตถุที่จะไม่ถูกส่งคืนเนื่องจากเธรดที่ใช้วัตถุที่ถูกล็อคจะตาย
ฉันคิดว่าฉันได้รับส่วนสำคัญนี้ แต่ถ้าฉันไม่อยู่โปรดแจ้งให้เราทราบ แนวคิดนี้สมเหตุสมผลสำหรับฉัน ฉันไม่มั่นใจอย่างสมบูรณ์ว่านี่เป็นสถานการณ์จริงที่อาจเกิดขึ้นใน. 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 ทำการประมวลผลบางอย่างที่ป้องกันเธรดจากการสัมผัสกับส่วนประกอบของระบบที่อาจมีผลกระทบประเภทนี้ แต่นั่นเป็นการเก็งกำไรอย่างหมดจดและอาจเป็นไปตามข้อเท็จจริงที่ว่าฉันไม่เคยได้ยินเรื่อง "zombie threads" ก่อน. ดังนั้นฉันหวังว่าฉันจะได้รับคำติชมเกี่ยวกับสิ่งนี้ที่นี่:
- มีคำจำกัดความที่ชัดเจนของ "เธรดซอมบี้" มากกว่าที่ฉันได้อธิบายไว้ที่นี่หรือไม่?
- เธรดซอมบี้สามารถเกิดขึ้นได้บน. NET (ทำไม / เพราะเหตุใด?)
- หากทำได้ฉันจะบังคับให้มีการสร้างเธรดซอมบี้ใน. NET ได้อย่างไร
- หากทำได้ฉันจะยกระดับการล็อคโดยไม่เสี่ยงต่อสถานการณ์ของเธรด zombie ใน. NET ได้อย่างไร
ปรับปรุง
ฉันถามคำถามนี้เมื่อสองปีก่อน วันนี้สิ่งนี้เกิดขึ้น:
wait
waitpid
กระบวนการลูกนั้นเรียกว่า "กระบวนการซอมบี้" ดูเพิ่มเติมได้ที่howtogeek.com/119815