धागा विवाद क्या है?


120

क्या कोई कृपया समझा सकता है कि धागा विवाद क्या है?

मैंने इसे देख लिया है, लेकिन एक साधारण स्पष्टीकरण नहीं ढूंढ सकता।


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

जवाबों:


87

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


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

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

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

185

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

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

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

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

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

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

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


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

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

4
@ नारोजी इसके बारे में एक प्रश्न पूछें।
डेविड श्वार्ट्ज

@DavidSchwartz, क्या आप सी प्रोग्रामर हैं?
22

@ स्पेसर सी ++ ज्यादातर।
डेविड श्वार्ट्ज

19

से यहाँ :

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

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


यह थ्रेड कॉन्टैक्शन और डेडलॉक के बीच अंतर को भी बताता है
संकल्प

3

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

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

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

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

... और मुझे यकीन है कि अन्य OS'es और अनुप्रयोग चौखटे के लिए दूसरों को।


2

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

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


1

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


1

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


1

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

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


0

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


0

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

से dotTrace प्रलेखन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.