2011-06-22 3 views
13

एक समवर्तीबैग बैग से वस्तुओं को जोड़ने और निकालने के लिए कई धागे की अनुमति देगा। यह संभव है कि एक थ्रेड बैग में एक आइटम जोड़ देगा और फिर उसी आइटम को वापस ले जायेगा। यह कहता है कि ConcurrentBag unordered है, लेकिन यह कितना unordered है? एक धागे पर, बैग एक स्टैक की तरह काम करता है। क्या अनियंत्रित मतलब "एक लिंक्ड सूची की तरह नहीं है"?ConcurrentBag <T> के लिए वास्तविक दुनिया का उपयोग क्या है?

ConcurrentBag के लिए असली दुनिया का उपयोग क्या है?

+5

क्या आप मतलब है "यह कैसे अव्यवस्थित है" था? या तो एक निर्धारित आदेश है या नहीं है। यह कहने की तरह है "एल्विस कितना मृत है?" –

+0

संग्रहीत तत्वों का क्रम क्लाइंट का व्यवसाय नहीं है। इसलिए एक एपीआई बिंदु दृश्य से, "unordered" हमेशा गणना के क्रम ('GetEnumerator' विधि से) को संदर्भित करता है। –

+3

"आदेश नहीं दिया गया" का अर्थ है कि आदेश के बारे में कोई गारंटी नहीं है।वर्तमान कार्यान्वयन का व्यवहार यह प्रतीत होता है कि यह एक स्टैक की तरह कार्य करता है जब एक ही थ्रेड जोड़ रहा है और हटा रहा है, और एक कतार की तरह जब एक थ्रेड किसी अन्य संग्रह से लेता है। लेकिन मैं उस व्यवहार पर भरोसा नहीं करता। थोड़ी अधिक जानकारी के लिए http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=842 देखें। ऑर्डर महत्वपूर्ण नहीं है, और यदि धागे उत्पादक और उपभोक्ता दोनों हो सकते हैं, तो 'ConcurrentBag'' ConcurrentQueue' से बेहतर प्रदर्शन दे सकता है। –

उत्तर

3

बैग उदाहरण उदाहरणों को ट्रैक करने के लिए वास्तव में उपयोगी हैं। उदाहरण के लिए, यदि आप रिकॉर्ड करना चाहते हैं कि आप किस होस्ट के लिए वेब अनुरोधों की सेवा कर रहे हैं, तो आप अनुरोध करते समय अपना आईपी बैग में जोड़ सकते हैं, और इसे पूरा करते समय हटा दें।

एक बैग का उपयोग करने से आप एक नज़र में बताने की अनुमति देंगे जो आप वर्तमान में सर्विसिंग कर रहे हैं। यह आपको तुरंत पूछताछ करेगा कि क्या आप किसी दिए गए आईपी पते की सेवा कर रहे हैं या नहीं।

यदि आप बैग के बजाए इसके लिए एक सेट का उपयोग करते हैं, तो एक ही आईपी पते से कई समवर्ती अनुरोध होने से आपके रिकॉर्ड-रखरखाव को गड़बड़ कर दिया जाएगा।

+7

आप कहते हैं कि बैग में अपना आईपी जोड़ें और फिर पूरा होने पर इसे हटा दें। आप बैग से एक विशिष्ट आइटम कैसे हटाते हैं? –

+2

@ डस्टिन: अच्छा सवाल। मैं ['ConcurrentHashMultiset'] (https://guava-libraries.googlecode.com/svn/tags/release09/javadoc/com/google/common/collect/ConcurrentHashMultiset.html) के बारे में सोच रहा था (जावा 'समवर्तीबैग' के बराबर) जब मैं अपना जवाब लिख रहा था, जो _does_ में 'निकालें' विधि है। मुझे नहीं पता कि .NET 'ConcurrentBag' वर्ग तब के लिए अच्छा है। :-P –

+2

ठीक है, आपके उत्तर के आधार पर मैं अपने स्वयं के लिए लागू वास्तविक दुनिया परिदृश्य के साथ आने में सक्षम था। –

1

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

+3

असली दुनिया परिदृश्य ... –

1

@ क्रिस जेस्टर-यंग के लिए धन्यवाद, मैं एक अच्छी, असली दुनिया, परिदृश्य के साथ आया जो वास्तव में उस परियोजना पर लागू होता है जिस पर मैं काम कर रहा हूं।

खोजें - प्रक्रिया - स्टोर

खोजें - धागे 1 & 2 डेटा खोजने या स्क्रैप की तैयारी में हैं (फाइल सिस्टम, वेब, आदि)। ये परिणाम ConcurrentBag1 में संग्रहीत हैं।

प्रक्रिया - धागे 3 & 4 ConcurrentBag1, स्वच्छ/बदलने/प्रक्रिया डेटा से बाहर ले और फिर ConcurrentBag2 में परिणाम स्टोर करने के लिए सेट कर रहे हैं।

स्टोर - थ्रेड 5 ConcurrentBag2 से परिणाम एकत्र करने के लिए सेट है और परिणामों को एसक्यूएल में संग्रहीत करता है।

+0

विवरण से, ऐसा लगता है कि यह 'ConcurrentBag' वर्ग की बजाय स्तरित कतारों (संभवतः 'ConcurrentQueue' या 'BlockingCollection' उदाहरणों) का उपयोग करके बेहतर कार्यान्वित किया जाएगा। कक्षा के उपयोग के बीच ओवरलैप की उचित मात्रा प्रतीत होती है, हालांकि मुझे गलत हो सकता है। –

12

क्योंकि कंसूरेंटबैग का कोई ऑर्डर नहीं है, ConcurrentStack/Queue पर एक प्रदर्शन लाभ है। इसे माइक्रोसॉफ्ट द्वारा स्थानीय थ्रेड स्टोरेज के रूप में कार्यान्वित किया जाता है। तो आइटम जो जोड़ता है वह हर धागा इसे अपने स्वयं के स्थान में करता है। वस्तुओं को पुनर्प्राप्त करते समय वे स्थानीय भंडारण से आते हैं। केवल जब वह खाली होता है तो थ्रेड किसी अन्य थ्रेड स्टोरेज से आइटम चुरा लेता है। तो एक साधारण सूची के बजाय एक ConcurrentBag वस्तुओं की एक वितरित सूची है। और लगभग लॉकफ्री है और उच्च समेकन के साथ बेहतर पैमाने पर होना चाहिए।

दुर्भाग्य .NET 4.0 में वहाँ एक प्रदर्शन मुद्दा (4.5 में ठीक किया गया) को देखने के http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0

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