मैं .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