2009-08-08 17 views
18

तो हम सभी कई उपलब्ध सामान्य वस्तुओं के लिए MSDN पर थ्रेडिंग अधिसूचना देखा है:उदाहरण सदस्यों को धागा-असुरक्षित बनाम सार्वजनिक स्थिर बनाता है?

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

मेरा सवाल यह है कि, एक सार्वजनिक स्थैतिक बनाम एक उदाहरण चर होने के बारे में क्या यह असुरक्षित बनाता है?

+3

ब्रैकेट्स में हिस्सा पढ़ने के दौरान भ्रम पैदा करता है - बल्कि इसे पढ़ें: इस प्रकार के सार्वजनिक स्थिर * सदस्य * थ्रेड सुरक्षित हैं। इसका मतलब है कि इस ऑब्जेक्ट प्रकार के स्थिर सदस्य थ्रेडसेफ हैं, यह "सार्वजनिक स्थैतिक प्रकार" का जिक्र नहीं कर रहा है; उदाहरण आपके कोड में घोषित किया जा रहा है। –

उत्तर

13

यह सामान्य रूप से केवल सत्य है।

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

यदि, ओटीएच, एक स्थैतिक विधि कक्षा की स्थिर संपत्ति या क्षेत्र तक पहुंचती है, तो यह समान रूप से गैर-थ्रेड-सुरक्षित है।

दौड़ होने के लिए चार स्थितियों की आवश्यकता है।

  1. पहली शर्त यह है कि स्मृति स्थान हैं जो एक से अधिक धागे से सुलभ हैं। आम तौर पर, ये स्थान वैश्विक/स्थैतिक चर होते हैं या वैश्विक/स्थैतिक चर से पहुंचने योग्य ढेर मेमोरी हैं।
  2. दूसरी शर्त यह है कि एक ऐसी संपत्ति है (जिसे अक्सर एक आविष्कार कहा जाता है), जो कि इन साझा स्मृति स्थानों से जुड़ा हुआ है जो प्रोग्राम सही तरीके से कार्य करने के लिए सत्य या मान्य होना चाहिए। आम तौर पर, अपडेट को सही होने के लिए अपडेट होने से पहले संपत्ति को सही रखने की आवश्यकता होती है।
  3. तीसरी स्थिति यह है कि परिवर्तनीय संपत्ति वास्तविक अद्यतन के कुछ हिस्सों में नहीं होती है। (प्रसंस्करण के कुछ हिस्सों में यह अस्थायी रूप से अमान्य या गलत है)।
  4. चौथी और अंतिम स्थिति जो होने वाली दौड़ के लिए होनी चाहिए वह यह है कि एक और धागा यादृच्छिक टूटने के दौरान स्मृति का उपयोग करता है, जिससे असंगत या गलत व्यवहार होता है।
8

यह राज्य का मुद्दा है। कौन सा सामान्य एकाधिक धागे के लिए असुरक्षित तरीकों को बनाता है, वे साझा स्थिति को थ्रेड सुरक्षित तरीके से एक्सेस नहीं करते हैं। सामान्य रूप से स्टेटिक विधियां साझा स्थिति तक नहीं पहुंचती हैं और इसलिए इस समस्या में भाग लेने की संभावना कम होती है। यदि वे स्थिर डेटा स्पर्श करते हैं तो स्थिर/साझा विधियों में दौड़ की स्थिति अभी भी संभव है लेकिन सामान्य स्थिर विधियों में नहीं है।

+0

शायद आपको इस तथ्य पर ज़ोर देना चाहिए कि यह सिर्फ 'सामान्य' है। – Dykam

+0

@Dykam, हाँ मैंने जोर दिया – JaredPar

12

कुछ भी नहीं इनबिल्ट बनाता स्थिर किसी भी अधिक या कम अलग (धागे की सुरक्षा कर रहे हैं) उदाहरण से, को छोड़कर:

  • स्थिर तरीके अक्सर राज्यविहीन "शुद्ध कार्यात्मक" तरीके हैं, जिससे उन्हें स्वचालित रूप से धागे की सुरक्षित
  • है को स्थिर सदस्यों पर एक स्पष्ट होने की उम्मीद की धागा सुरक्षित (जब से तुम वास्तव में नियंत्रित नहीं कर सकते क्या प्रत्येक थ्रेड एक ही बार में कर रहा है) - तो यह की उम्मीद है है कि किसी भी स्थिर विधि

    • उदाहरण तरीकों आमतौर पर कि उदाहरण
    • पर राज्य का उपयोग वहाँ धागा सुरक्षा के कोई उम्मीद है: जोखिम धागे की सुरक्षा

    इस उदाहरण तरीकों के लिए सच नहीं है धागा सुरक्षित बनाया जा सकता है जब तक यह प्रलेखन

तो सामान्य रूप से यह अपेक्षा की जाती है कि कॉलर उदाहरणों पर थ्रेड-सुरक्षा का प्रबंधन करें।

ऐसे अपवाद हैं जहां उदाहरण थ्रेड-सुरक्षित होते हैं (आम तौर पर उन चीज़ों के लिए जो थ्रेडिंग से गहराई से बंधे होते हैं, जैसे कि निर्माता-उपभोक्ता कतार) - लेकिन आईएमओ किसी स्थिर सदस्य जो थ्रेड सुरक्षित नहीं है, वह एक बग है।

+1

@marc पर जोर देने के लिए उस हिस्से को बोल्ड किया, मैं नम्रता से असहमत हूं ... यह नहीं कहने के लिए कि ऐसा अस्तित्व में नहीं है, लेकिन मुझे कभी उम्मीद नहीं थी कि स्थिर तरीके थ्रेड-सुरक्षित हैं, और न ही मैंने सुना है ऐसी उम्मीद स्टेटिक विधियां अभी भी स्थिर चर, (किसी भी वर्ग से) तक पहुंच सकती हैं, साथ ही विधि पैरामीटर के रूप में पारित वस्तुओं में इंस्टेंस वेरिएबल भी हो सकती हैं। –

+0

(cont) आपकी अपेक्षाओं पर भरोसा किया जा सकता है एकमात्र तरीका यह है कि यदि सभी स्थैतिक विधियों को किसी संदर्भित चर-संदर्भ चर, या संदर्भ प्रकारों के उदाहरणों, या उस या किसी अन्य वर्ग में किसी भी स्थिर चर का उपयोग करने से प्रतिबंधित किया गया है। यह आपके "उम्मीद" को भरोसेमंद होने की अनुमति देने के लिए असाधारण रूप से भारी प्रतिबंध लग रहा है। –

+0

आप तर्क का पालन नहीं करते हैं। मैं अपने स्वयं के स्थैतिक राज्य (जैसे स्थैतिक शब्दकोश पर एक स्थैतिक शब्दकोश/सूची, स्थिर विधि द्वारा उपयोग की जाने वाली) के बारे में बात कर रहा हूं, क्योंकि कॉलर द्वारा नियंत्रित नहीं किया जा सकता है। आम तौर पर स्थैतिक विधियां किसी भी निजी राज्य का उपयोग न करने की सरल चाल से थ्रेड-सुरक्षित होती हैं ;- पी 'रेफरी' या रीफ-टाइप तर्क जैसे चीजों की स्थिति * कॉलर द्वारा नियंत्रित होती है, और इसे प्रबंधित किया जाना चाहिए। इसी तरह बाहरी कॉल को प्रभावित नहीं करता है। उम्मीद ** ** है, अन्यथा आपके सी # कोड की लगभग हर पंक्ति में लॉक होने का ** बहुत ** होगा। –

0

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

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

+0

स्टैटिक विधियों थ्रेडसेफ के लिए स्थिर निजी डेटा क्यों है? – Dykam

+0

मैं इस प्रकार के निजी सदस्यों के रूप में निजी के बारे में बात नहीं कर रहा हूं, लेकिन स्थानीय रूप में निजी हूं। चूंकि प्रत्येक धागे का अपना ढेर होता है जहां स्थानीय संग्रहित होते हैं, ये अलग-अलग धागे के बीच साझा नहीं होते हैं और इस प्रकार स्वाभाविक रूप से थ्रेड सुरक्षित होते हैं। –

0

टीएलडीआर; "क्या इसका मतलब है कि स्थैतिक तरीके स्वाभाविक रूप से थ्रेड सुरक्षित हैं? उत्तर नहीं है। उपर्युक्त नोट वाले वर्गों में थ्रेड सुरक्षित स्थिर विधियां होंगी क्योंकि माइक्रोसॉफ्ट इंजीनियरों ने थ्रेड सुरक्षित तरीके से कोड लिखा था, शायद ताले या अन्य थ्रेड सिंक्रनाइज़ेशन तंत्र का उपयोग करके" (उद्धरण http://odetocode.com/Articles/314.aspx से लिया गया)

अधिक विस्तार

यह क्या है? उस विशेष वर्ग के लिए लिखे गए कोड को छोड़कर कुछ भी नहीं।

कथन एक घोषणा है जो आपको बताती है कि कक्षा लिखने वाले प्रोग्रामर ने यह सुनिश्चित किया है कि सभी स्थिर सदस्य (विधियों और गुण) थ्रेड सुरक्षित हैं (लेकिन उदाहरण के सदस्यों के लिए ऐसा नहीं किया है)।

यह सुनिश्चित कर लिया है कि स्थैतिक थ्रेड सुरक्षित हैं क्योंकि स्थिर होने की संभावना है कि उन्हें कई धागे से बुलाया जाएगा, इसलिए यह सुनिश्चित करने के लिए आवश्यक अतिरिक्त काम किया जाता है कि यह ठीक रहेगा। अक्सर स्थैतिक विधियां भी स्टेटलेस फ़ंक्शन हैं, जिसका अर्थ है कि वे पहले से ही आम तौर पर थ्रेड सुरक्षित हैं (कोई अतिरिक्त काम आवश्यक नहीं है)।

इसके विपरीत, उदाहरण के लिए सदस्यों का बयान केवल उन्हें बता रहा है कि वे उनके साथ सावधान नहीं हैं।

अक्सर उदाहरण एक ही थ्रेड द्वारा बनाए जाएंगे और केवल उस थ्रेड द्वारा उपयोग किए जाएंगे; अगर आवृत्ति को कई धागे से कभी भी एक्सेस नहीं किया जाता है, तो थ्रेड सुरक्षा कोई समस्या नहीं है, इसलिए प्रोग्रामर इसे जोड़ने के लिए परेशान नहीं थे।

कथन स्थैतिक बनाम उदाहरण के किसी अंतर्निहित गुणों के बारे में दावा नहीं है; दोनों असुरक्षित हो सकते हैं जब तक कि आप यह सुनिश्चित करने के लिए विशिष्ट कोड नहीं डालते कि एकाधिक धागे बिना किसी समस्या के उन्हें एक्सेस कर सकते हैं (या यदि प्रकृति से वे पहले से ही थ्रेड सुरक्षित हैं, उदाहरण के लिए एक स्टेटलेस फ़ंक्शन)।

यह केवल एक बयान है कि उन वर्गों को लिखने वाले प्रोग्रामर ने यह सुनिश्चित किया है कि स्थिर सदस्य सुरक्षित हैं, लेकिन उदाहरण के लिए ऐसा नहीं किया है।

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