2009-12-28 22 views
70

क्या कोई कृपया बता सकता है कि थ्रेड विवाद क्या है?धागा विवाद क्या है?

मैंने इसे गुगल किया है, लेकिन एक सरल स्पष्टीकरण नहीं लग रहा है।

+6

तो लिखो कि आपका अस्पष्ट विचार क्या है, इसलिए हम देख सकते हैं कि आप कहां से बंद हो सकते हैं, या आपकी समझ सही हो सकती है। –

उत्तर

56

अनिवार्य रूप से थ्रेड विवाद एक ऐसी स्थिति है जहां एक थ्रेड लॉक/ऑब्जेक्ट की प्रतीक्षा कर रहा है जो वर्तमान में किसी अन्य थ्रेड द्वारा आयोजित किया जा रहा है। इसलिए, यह प्रतीक्षा धागा उस ऑब्जेक्ट का उपयोग तब तक नहीं कर सकता जब तक कि अन्य थ्रेड ने उस विशेष ऑब्जेक्ट को अनलॉक नहीं किया हो।

+30

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

+0

ग्लोबल इंटरप्रेटर लॉक (जीआईएल) जैसे कि सीपीथन में, जहां एक थ्रेड हमेशा जीआईएल हासिल करना चाहिए, इसलिए एक ही प्रक्रिया में चल रहे कई थ्रेड डिफ़ॉल्ट रूप से विवाद में हैं। –

+0

मुझे लगता है कि आपने इसे डेडलॉक के संदर्भ में समझाया है लेकिन यह डेडलॉक से बहुत अलग है। –

1

एक और शब्द समरूपता हो सकता है। यह केवल एक ही संसाधन का उपयोग करने की कोशिश कर रहे दो या दो से अधिक धागे का विचार है।

2

आपके पास 2 धागे हैं। थ्रेड ए और थ्रेड बी, आपके पास ऑब्जेक्ट सी

ए वर्तमान में ऑब्जेक्ट सी तक पहुंच रहा है, और उस ऑब्जेक्ट पर लॉक लगाया है। बी वस्तु सी का उपयोग करने की जरूरत है, लेकिन ऐसा नहीं कर सकते जब तक एक वस्तु सी

16

पर ताला here से विज्ञप्ति:

एक विवाद तब होता है जब एक धागा है एक संसाधन है कि नहीं है के लिए इंतजार आसानी से उपलब्ध; यह आपके कोड के निष्पादन को धीमा करता है, लेकिन समय के साथ साफ़ कर सकता है।

एक गतिरोध तब होता है जब एक धागा एक संसाधन है कि एक दूसरे धागा बंद कर दिया गया के लिए इंतजार है, और दूसरा धागा एक संसाधन है कि पहले धागा बंद कर दिया गया के लिए इंतजार कर रहा है। से अधिक 0 धागे डेडलॉक में शामिल हो सकते हैं। एक डेडलॉक कभी भी को हल नहीं करता है। यह अक्सर एप्लिकेशन, या भाग को रोकने के लिए, डेडलॉक का अनुभव करने का कारण बनता है।

+0

यह थ्रेड कंटेंट और डेडलॉक – Sankalp

125

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

विवाद का सबसे स्पष्ट उदाहरण लॉक पर है। अगर थ्रेड ए में लॉक है और थ्रेड बी उसी लॉक को हासिल करना चाहता है, तो थ्रेड बी को थ्रेड ए लॉक जारी होने तक इंतजार करना होगा।

अब, यह प्लेटफ़ॉर्म-विशिष्ट है, लेकिन थ्रेड को मंदी का अनुभव हो सकता है भले ही इसे अन्य धागे को लॉक जारी करने की प्रतीक्षा न हो! ऐसा इसलिए है क्योंकि लॉक किसी प्रकार का डेटा सुरक्षित करता है, और डेटा का भी अक्सर विरोध किया जाएगा।

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

क्यों? कहें कि प्रत्येक धागा अपने मूल पर एक आधुनिक x86 सीपीयू पर चल रहा है और कोर एल 2 कैश साझा नहीं करते हैं। केवल एक धागे के साथ, ऑब्जेक्ट अधिकांश समय में एल 2 कैश में रह सकता है। दोनों थ्रेड चलने के साथ, प्रत्येक बार एक थ्रेड ऑब्जेक्ट को संशोधित करता है, अन्य थ्रेड पाएगा कि डेटा अपने एल 2 कैश में नहीं है क्योंकि अन्य सीपीयू ने कैश लाइन को अमान्य कर दिया है।एक पेंटियम डी पर, उदाहरण के लिए, यह कोड को एफएसबी गति पर चलाने का कारण बनता है, जो एल 2 कैश की गति से बहुत कम है।

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

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

+2

+1 के बीच अंतर भी बताता है, इसके अलावा, बस यह स्पष्ट करने के लिए, दो कोरों पर लड़ने वाले दो चर को विवाद के कारण एक ही चर होने की आवश्यकता नहीं है, उन्हें केवल संग्रहित करना होगा एक ही कैश लाइन में स्मृति में। पैडिंग संरचनाएं और/या स्मृति में संरेखण संरचनाएं इस विवाद से बचने में मदद कर सकती हैं। –

+1

@ डेविड कृपया अपने उत्तर के अंतिम पैरा को और अधिक विस्तार से समझने में मदद करें –

+3

@ नारोजी इसके बारे में एक प्रश्न पूछें। –

1

मेरे लिए विवाद एक प्रतियोगिता है एक साझा संसाधन पर 2 या अधिक धागे के बीच। संसाधन लॉक, काउंटर इत्यादि हो सकता है। प्रतियोगिता का अर्थ है "इसे पहले कौन प्राप्त करता है"। अधिक धागे अधिक विवाद। संसाधन के लिए अधिक लगातार पहुंच अधिक विवाद।

2

मुझे लगता है कि प्रश्न की पृष्ठभूमि पर ओपी से कुछ स्पष्टीकरण होना चाहिए - मैं 2 जवाब के बारे में सोच सकते हैं (हालांकि मुझे यकीन है कि वहाँ इस सूची में जोड़ रहे हैं हूँ):

  1. अगर आप थ्रेड विवाद की सामान्य "अवधारणा" का जिक्र कर रहे हैं और यह एक आवेदन में खुद को कैसे पेश कर सकता है, मैं उपरोक्त @ डेविडस्वार्टज़ के विस्तृत उत्तर को रोकता हूं।

  2. '.NET CLR ताले और थ्रेड: सामग्री # प्रदर्शन काउंटर का कुल # भी है। जैसा कि इस काउंटर के लिए पेर्फमॉन विवरण से लिया गया है, इसे परिभाषित किया गया है:

    यह काउंटर सीएलआर में कई बार थ्रेड को प्रबंधित लॉक को असफल तरीके से प्राप्त करने का प्रयास करता है। प्रबंधित ताले कई तरीकों से हासिल किया जा सकता है; सी # में "लॉक" कथन द्वारा या System.Monitor.Anter को कॉल करके या MethodImplOptions.Synchronized कस्टम विशेषता का उपयोग करके।

... और मुझे अन्य OS'es और एप्लीकेशन फ्रेमवर्क के लिए यकीन है कि दूसरों को कर रहा हूँ।

0

थ्रेड विवाद I/O संचालन से भी प्रभावित होता है। उदाहरण जब फ़ाइल पढ़ने के लिए प्रतीक्षा थ्रेड एक विवाद के रूप में विचार कर सकते हैं। समाधान के रूप में I/O समापन बंदरगाहों का उपयोग करें।

0

लॉक विवाद जब एक धागा एक वस्तु जो पहले से ही अन्य धागा * ने अधिग्रहण कर लिया है को ताला प्राप्त करने के लिए कोशिश करता है जगह लेता है। ऑब्जेक्ट जारी होने तक, थ्रेड अवरुद्ध है (दूसरे शब्दों में, यह प्रतीक्षा स्थिति में है)। कुछ मामलों में, यह एक तथाकथित धारावाहिक निष्पादन का कारण बन सकता है जो नकारात्मक रूप से अनुप्रयोग को प्रभावित करता है।

dotTrace documentation से

0

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

उदाहरण के तौर पर, दोनों मामले प्रतिद्वंद्विता का अर्थ देते हैं।

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