2008-09-25 14 views
9

ThreadStatic attribute अद्वितीय-प्रति-थ्रेड के रूप में स्थिर चर घोषित करता है। क्या आप इस तरह के चर का सही ढंग से निपटान करने के लिए एक आसान पैटर्न जानते हैं?थ्रेडस्टैटिक ऑब्जेक्ट्स का निर्धारण निपटान

थ्रेडस्टैटिक से पहले हमने जो भी उपयोग किया था वह थ्रेड कॉन्टेक्स्ट मैनेजर है। प्रत्येक थ्रेड को थ्रेडकॉन्टेक्स्ट आवंटित किया गया था जो सभी थ्रेड-विशिष्ट जानकारी को बनाए रखता था। हमने कुछ धागे पैदा किए और उन्हें काम करने दिया। फिर, जब वे सब खत्म हो गए, तो हमने थ्रेडकंटेंट मैनेजर का निपटारा किया, जिसने बदले में सभी संदर्भों का निपटारा किया, यदि वे पहचान योग्य थे।

मुझे इस पैटर्न को थ्रेडस्टैटिक ऑब्जेक्ट्स में अनुवाद करने का तत्काल तरीका दिखाई नहीं देता है। वस्तुओं को अंततः निपटाया जाएगा, क्योंकि धागे मर जाते हैं, और इसलिए कुछ भी उन्हें संदर्भित नहीं करता है। हालांकि, जब भी संभव हो हम निर्धारक निपटान पसंद करते हैं।

अद्यतन

मैं वास्तव में धागे सीधे नियंत्रित नहीं करते हैं - मैं माइक्रोसॉफ्ट सीसीआर है, जो एक ThreadPool कि कार्य करता है का उपयोग कर रहा हूँ। जब सभी कार्य किए जाते हैं, तो मैं डिस्पैचर का निपटारा कर रहा हूं (जिसमें थ्रेडपूल है)। बात यह है कि - मुझे धागे के मुख्य कार्य के अंत में कुछ भी करने का मौका नहीं मिलता है - इसलिए मैं थ्रेड के रन के अंत में मैन्युअल रूप से चीजों का निपटान नहीं कर सकता। क्या मैं थ्रेड के बाहर से धागे की स्थैतिक वस्तुओं को किसी भी तरह से एक्सेस कर सकता हूं?

उत्तर

1

आप अभी भी निपटान को संभालने के लिए अपने ThreadContextManager क्लास के बराबर उपयोग कर सकते हैं। स्पैन्ड किए गए धागे इस 'प्रबंधक' ऑब्जेक्ट का निपटान करते हैं जो बदले में अन्य सभी धागे स्थिर वस्तुओं को जानता है जो इसके बारे में जानते हैं।

मैं अपेक्षाकृत कुछ धागे स्थिर वस्तुओं को पसंद करता हूं और इसके बजाय एक संदर्भ वस्तु का उपयोग करता हूं। यह थ्रेड विशिष्ट स्थिति को केवल कुछ स्थानों में रखता है, और इस तरह के पैटर्न को आसान बनाता है।

अद्यतन: थ्रेडपूल मामले को संभालने के लिए आप आधार 'कार्य' ऑब्जेक्ट बना सकते हैं जो कि आप थ्रेड पूल में जाते हैं। यह आपके कोड की किसी भी सामान्य प्रारंभिकता को निष्पादित कर सकता है, 'वास्तविक' कार्य का आह्वान कर सकता है और उसके बाद आवश्यक कोई क्लीनअप निष्पादित करता है।

+0

मैं प्रत्येक कार्य के बाद सफाई करना नहीं चाहता हूं। मेरे थ्रेडपूल में दिया गया कोई भी थ्रेड अनुक्रमिक रूप से कई कार्य करता है। संदर्भ में इसका कारण है प्रति कार्य डेटा संरचनाओं के महंगे आवंटन को बचाने के लिए। इसका मतलब है कि सभी थ्रेड समाप्त होने के बाद ही मैं केवल सफाई कर सकता हूं। – ripper234

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