2012-01-25 19 views
14

मैं निम्नलिखित कोड है:नया धागा() और कूड़ा संग्रह

new Thread(new ThreadStart(delegate() 
{ 
    while (true) 
    { 
     //something 
    } 
})).Start(); 

कचरा कलेक्टर Thread के इस उदाहरण को अंतिम रूप देने सकते हैं, जबकि यह Running राज्य में है?

उत्तर

21

सीएलआर सभी चल रहे धागे का ट्रैक रखता है। जब तक वस्तुओं के संदर्भ हैं वे कचरा नहीं एकत्र करेंगे। और चूंकि सीएलआर सभी चल रहे धागे का संदर्भ रखता है क्योंकि जीसी उन्हें छू नहीं पाएगा।

13

नहीं; चलने वाले धागे जड़ों के रूप में गिनती हैं। एक थ्रेड के लिए स्टैक के सक्रिय भाग (ओं) द्वारा संदर्भित कोई भी थ्रेड एकत्र नहीं किया जाएगा, न ही कुछ भी संदर्भित किया जाएगा।

+0

_running धागे जड़ों के रूप में गिनती है? _ या _references (एक धागे के अंदर) जो वस्तुओं के संदर्भ में जड़ों के रूप में गिना जाता है .._? –

+0

@ रॉय जड़ों - मूल रूप से, ढेर स्थानीय। ध्यान दें कि arg0 (उर्फ यह) आमतौर पर लक्षित उदाहरण को जीवित रखेगा –

+0

तो क्या यह गलत/ठीक कहने के लिए है: _GC को चल रहे थ्रेड_ को एकत्र करने की अनुमति नहीं है? –

2

धागा एकत्र नहीं किया जाएगा, क्योंकि प्रत्येक चलने, प्रतीक्षा करने या निलंबित थ्रेड का उपयोग जीसी द्वारा किया जाता है ताकि यह तय किया जा सके कि जीवित क्या है (प्रत्येक धागे के ढेर में सबकुछ का पता लगाएं, उन सभी वस्तुओं द्वारा संदर्भित सबकुछ का पता लगाएं, फिर सबकुछ उन लोगों द्वारा संदर्भित, और इसी तरह, और आपने सब कुछ पहचाना है जो कचरा नहीं हो सकता है)।

थ्रेड समाप्त हो सकता है, अगर यह पृष्ठभूमि धागा था, क्योंकि तब प्रक्रिया में सभी अन्य धागे खत्म होने पर यह सक्रिय रूप से बंद हो जाएगा। अन्यथा एकमात्र चीज जो इसे मरने का कारण बनती है वह प्रक्रिया सक्रिय रूप से बाहर निकलती है, एक अपवाद (ThreadAbortException सहित) या यह while लूप से बाहर तोड़ रहा है।

एक मामला है कि कुछ मायनों में तुलनीय है नहीं है, कि हो सकता है कि तुम क्या करने की सोच रहे हैं:

var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5)); 
int someResult = doingSomethingElse(); 
doSomethingElseThatTakesLongerThan5Seconds(); 

यह एक और कोड है कि कुछ करने के लिए निष्पादन की एक और धागा कारण बनता है। इस मामले में, टाइमर वास्तव में रन से पहले एकत्रित कचरा हो सकता है, रनों में से एक के दौरान, या कन्स्ट्रक्टर रिटर्न के बाद किसी भी समय काफी सुंदर हो सकता है।

यहां महत्वपूर्ण बात यह है कि टाइमर के लिए कोई व्यक्तिगत धागा नहीं है, और धागा टाइमर ऑब्जेक्ट के बारे में "पता" भी नहीं है। चूंकि ऑब्जेक्ट की अंतिम पहुंच तब से हुई है, यह संग्रह के लिए योग्य है। यह चल रहे व्यक्तिगत थ्रेड के मामले से अलग है (या प्रतीक्षा, इत्यादि)।

संबंधित मुद्दे