2010-06-12 9 views
6

मैं समांतर एक्सटेंशन का काफी उपयोग कर रहा हूं और अब मुझे एक ऐसे मामले का सामना करना पड़ा है जहां थ्रेड स्थानीय स्टोरेज का उपयोग कार्यकर्ता धागे द्वारा वस्तुओं के पुन: उपयोग की अनुमति देने के लिए समझदार हो सकता है। जैसे कि मैं थ्रेडस्टैटिक विशेषता को देख रहा था जो एक स्थिर क्षेत्र/परिवर्तनीय को प्रति थ्रेड के अद्वितीय मूल्य के रूप में चिह्नित करता है।थ्रेडस्टैटिक विशेषता के साथ समानांतर एक्सटेंशन का उपयोग करना। क्या यह स्मृति रिसाव कर सकता है?

ऐसा लगता है कि पीई द्वारा थ्रेड पुन: उपयोग की गारंटी के बिना थ्रेडस्टैटिक विशेषता के साथ पीई का उपयोग करना मूर्ख नहीं होगा। यही है, अगर कुछ डिग्री के लिए थ्रेड बनाए जाते हैं और नष्ट हो जाते हैं तो चर (और इस प्रकार वे ऑब्जेक्ट्स इंगित करते हैं) कुछ अनिश्चित समय के लिए स्थानीय भंडारण में रहते हैं, जिससे स्मृति रिसाव होता है? या शायद धागा भंडारण धागे से बंधे हैं और धागे का निपटान कब किया जाता है? लेकिन फिर भी आपके पास अभी भी एक पूल में धागे हैं जो लंबे समय तक जीवित रहते हैं और थ्रेड के विभिन्न टुकड़ों से थ्रेड स्थानीय भंडारण जमा करते हैं।

क्या पीई के साथ थ्रेड स्थानीय भंडारण प्राप्त करने के लिए एक बेहतर तरीका है?

धन्यवाद।

+0

सही शब्दावली पूल से हटाए गए थ्रेडों के बारे में "नष्ट" की बजाय "सेवानिवृत्त" है और फिर अपने ढेर को बंद कर देती है। –

उत्तर

5

मैं MSDN article में वर्णित धागे-स्थानीय भंडारण के सामान्य पैटर्न का उपयोग करके दृढ़ता से प्रोत्साहित करता हूं।

जब आप [थ्रेडस्टैटिक] का उपयोग करते हैं, तो क्या मायने रखता है कि थ्रेडपूल थ्रेड टीएलएस वैरिएबल को समाप्त होने पर साफ़ करता है या नहीं। एमएसडीएन दस्तावेज़ों में कोई सुझाव नहीं है कि यह नहीं करता है। इसे लागू करना मुश्किल नहीं होगा, इसे केवल TlsFree() API फ़ंक्शन को कॉल करना होगा। मैंने थोड़ा परीक्षण ऐप लिखा, किसी भी रिसाव का कोई सबूत नहीं।

4

संपादित करें: हंस के जवाब को देखते हुए यह लगता है कि वास्तव में टीएलएस अप वैसे भी साफ किया है ... जो सिर्फ जवाब के इस बिट छोड़ देता है:

तुम सच में भीतर मूल्यों पुन: उपयोग का कोई बेहतर तरीका है एक धागा? यदि दो कार्य हैं जो एक ही धागे का उपयोग करते हैं (एक पूरा करता है, तो दूसरे रन) क्या वे वास्तव में एक ही मूल्य चाहते हैं? क्या आप असल में बस अपने कार्य के माध्यम से डेटा को अधिक नियंत्रित तरीके से प्रसारित करने से बचने के तरीके के रूप में इसका उपयोग कर रहे हैं?

+0

परिदृश्य एक ग्रिड आधारित 'दुनिया' का सिमुलेशन है - स्वतंत्र रूप से कहा गया दुनिया में एजेंटों के एक सेट का मूल्यांकन। इसलिए समानांतर में चलाने के लिए मैं प्रत्येक समांतर लूप के भीतर एक नई दुनिया बना सकता हूं, उपयोग कर सकता हूं और त्याग सकता हूं। मेरा इरादा पुन: उपयोग की अनुमति देने के लिए दुनिया पर एक रीसेट() विधि डालना था। मुझे लगता है कि स्थैतिक स्थानीय भंडारण मुझे 'दुनिया' के अपने पूल को पूल से जुड़े थ्रेड लॉक एक्सेस आदि के साथ प्रबंधित करने से बाहर कर देता है। – redcalx

+0

@ द-लॉन्स्टर: मुझे डर है कि मुझे अभी भी धागे का लाभ नहीं दिख रहा है -लोकल भंडारण यहाँ। यदि यह किसी कार्य के भीतर है, तो संदर्भ को क्यों न रखें? –

+0

प्रत्येक मूल्यांकन एक एजेंट को अपने आप में एक ही दुनिया में रखता है। इस प्रकार यदि मेरे पास 8 सीपीयू कोर/धागे हैं तो मेरे पास 8 स्वतंत्र दुनिया किसी भी समय अनुकरण किए जा रहे हैं - प्रति थ्रेड एक विश्व। – redcalx

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