2011-08-25 16 views
12

मैं बाहरी समवर्तीबैग पॉप्युलेट करने के लिए समानांतर। Foreach का उपयोग कर रहा हूं। मैंने एक आम सूची का उपयोग करने की भी कोशिश की और सब कुछ ठीक काम करता है।जब एक ConcurrentBag सूची से बेहतर है?

मैं भाग्यशाली रहा हूं या मुझे ConcurrentBag के विशेष दायरे को याद किया गया है?

+0

कितने कोर/सीपीयू अपने विकास मशीन है? – ChaosPandion

+0

दो प्रोसेसर। – abx78

उत्तर

18

आप भाग्यशाली रहे हैं; Parallel.ForEach किसी सूची को पॉप्युलेट करने के लिए थ्रेड-सुरक्षित नहीं है, अंततः आप समस्याओं में भाग लेंगे।

MSDN के अनुसार, List<T> सुरक्षित थ्रेड नहीं है:

किसी भी उदाहरण सदस्यों की गारंटी नहीं है सुरक्षित थ्रेड किया जाना है।

एक सूची < टी > कई पाठकों को समवर्ती रूप से समर्थन दे सकती है, जब तक संग्रह संशोधित नहीं किया जाता है। संग्रह के माध्यम से गणना आंतरिक रूप से थ्रेड-सुरक्षित प्रक्रिया नहीं है। दुर्लभ मामले में जहां गणना एक या अधिक लेखन पहुंच के साथ होती है, का एकमात्र तरीका सुनिश्चित करें कि थ्रेड सुरक्षा पूरे गणना के दौरान संग्रह को लॉक करना है। संग्रह को पढ़ने और लिखने के लिए संग्रह को धागे द्वारा एक्सेस करने की अनुमति देने के लिए, आपको अपना सिंक्रनाइज़ेशन लागू करना होगा।

ConcurrentBag यह है कि आपको इसके लिए क्या उपयोग करना चाहिए, जो एकाधिक पाठकों और लेखकों के लिए थ्रेड-सुरक्षित है।

+0

इसे स्पष्ट करने के लिए धन्यवाद! – abx78

+0

आपका स्वागत है। स्वीकृत के रूप में उत्तर में से एक को चिह्नित करें। धन्यवाद! –

5

यदि आप Parallel.ForEach का उपयोग List<T> पर पॉप्युलेट करने के लिए कर रहे हैं और सब कुछ ठीक काम कर रहा है तो आप बस भाग्यशाली हो रहे हैं। ForEach विधि एकाधिक कोडों पर आपका कोड चला सकती है और चलाएगी ताकि ForEach के बाहर कोई भी संचार उन ऑब्जेक्ट्स के साथ होना चाहिए जो समवर्ती अद्यतनों को संभाल सकें। List<T>ConcurrentBag<T> कर सकते हैं लेकिन नहीं कर सकते हैं।

+0

दोनों प्रश्न अच्छे थे, धन्यवाद! – abx78

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