2010-06-14 10 views
75

मेरे आवेदन में मेरे पास एक स्थिर विधि है जिसे एक ही समय में एकाधिक धागे से बुलाया जाता है। क्या मेरे डेटा को मिश्रित करने का कोई खतरा है?सी #: क्या होगा अगर एकाधिक धागे से एक स्थिर विधि कहा जाता है?

मेरे पहले प्रयास में विधि स्थिर नहीं थी और मैं कक्षा के कई उदाहरण बना रहा था। उस स्थिति में मेरा डेटा किसी भी तरह मिश्रित हो गया। मुझे यकीन नहीं है कि यह कैसे होता है क्योंकि यह कभी-कभी होता है। मैं अभी भी डिबगिंग कर रहा हूं। लेकिन अब विधि स्थिर है क्योंकि मुझे अब तक कोई समस्या नहीं है। शायद यह सिर्फ भाग्य है। मैं निश्चित रूप से नहीं जानता।

उत्तर

74

वैरिएबल के अंदर घोषित वैरिएबल (पर कब्जा "चर) के संभावित अपवाद के साथ अलग हैं, इसलिए आपको कोई अंतर्निहित समस्या नहीं मिलेगी; हालांकि, यदि आपकी स्थैतिक विधि किसी भी साझा स्थिति तक पहुंच जाती है, तो सभी दांव बंद हैं।

साझा राज्य के उदाहरण होगा:

  • स्थिर क्षेत्रों
  • वस्तुओं (उन वस्तुओं पर और राज्य) एक आम कैश (गैर धारावाहिक)
  • डेटा इनपुट पैरामीटर के माध्यम से प्राप्त से पहुँचा , अगर यह संभव है कि एक से अधिक थ्रेड एक ही वस्तु (रों)

को छू रहे हैं आप राज्य साझा किया है है, तो आप या तो:

  • ले देखभाल राज्य उत्परिवर्तित के लिए नहीं एक बार यह साझा किया जा सकता (बेहतर: राज्य का प्रतिनिधित्व करते हैं, और एक स्थानीय चर में स्थिति का एक स्नैपशॉट लेने के लिए अपरिवर्तनीय वस्तुओं का उपयोग करें - यानी बजाय संदर्भ whatever.SomeData बार-बार, तो आप whatever.SomeDataपढ़ एक बार एक स्थानीय चर में, और फिर केवल चर का उपयोग करें - ध्यान दें कि यह केवल अपरिवर्तनीय स्थिति में मदद करता है!)
  • डेटा तक पहुंच को सिंक्रनाइज़ करना (सभी धागे सिंक्रनाइज़ करना चाहिए) - या तो परस्पर अनन्य या (अधिक बारीक) पाठक/लेखक
+1

इस http://msdn.microsoft.com/library/c5kehkcz(VS पर एक नज़र डालें .80) .aspx –

+1

@Diego - क्या यह टिप्पणी मेरे लिए या @ होली के लिए है? –

+0

होली को, बस अपने उत्तर में कुछ व्यावहारिक जानकारी जोड़ने के लिए। –

9

कई धागे के लिए स्टेटिक विधियां ठीक होनी चाहिए।

दूसरी तरफ स्थिर डेटा समस्या पैदा कर सकता है क्योंकि विभिन्न धागे से उसी डेटा तक पहुंचने के प्रयासों को नियंत्रित करने के लिए नियंत्रित किया जाना चाहिए ताकि एक समय में केवल एक थ्रेड डेटा पढ़ या लिख ​​रहा हो।

+0

यहां कीवर्ड सिंक्रनाइज़ेशन है :-) –

+0

पढ़ने एक साथ होने के लिए ठीक है, लेकिन एक साथ पढ़ने और लिखने से अप्रत्याशित व्यवहार – Freestyle076

4

एमएसडीएन हमेशा कहते हैं:

कोई भी सार्वजनिक स्थैतिक (विजुअल बेसिक में साझा) इस प्रकार के सदस्य थ्रेड सुरक्षित हैं। किसी भी इंस्टेंस सदस्यों को थ्रेड सुरक्षित होने की गारंटी नहीं है।

संपादित करें: यहाँ लोग के रूप में कहते हैं, नहीं हमेशा मामला है, और स्पष्ट रूप से इस उपयोगकर्ता द्वारा बनाए कक्षाएं, जहां इस पर लागू नहीं होता के लिए नहीं बीसीएल में इस तरह से तैयार किया गया है, वर्गों के लिए लागू होता है।

16

हाँ, यह बस भाग्य है। ;)

इससे कोई फर्क नहीं पड़ता कि विधि स्थिर है या नहीं, क्या मायने रखता है कि डेटा स्थिर है या नहीं।

यदि प्रत्येक थ्रेड के पास डेटा के अपने सेट के साथ कक्षा का अपना अलग उदाहरण होता है, तो डेटा को मिश्रित करने का कोई जोखिम नहीं होता है। यदि डेटा स्थिर है, तो डेटा का केवल एक सेट है, और सभी थ्रेड एक ही डेटा साझा करते हैं, इसलिए इसे मिश्रण करने का कोई तरीका नहीं है।

जब अलग-अलग उदाहरणों में आपका डेटा अभी भी मिश्रित हो जाता है, तो यह सबसे अधिक संभावना है क्योंकि डेटा वास्तव में अलग नहीं है।

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