क्या कोई कृपया समझा सकता है कि धागा विवाद क्या है?
मैंने इसे देख लिया है, लेकिन एक साधारण स्पष्टीकरण नहीं ढूंढ सकता।
क्या कोई कृपया समझा सकता है कि धागा विवाद क्या है?
मैंने इसे देख लिया है, लेकिन एक साधारण स्पष्टीकरण नहीं ढूंढ सकता।
जवाबों:
अनिवार्य रूप से धागा विवाद एक ऐसी स्थिति है जहां एक धागा एक ताला / वस्तु की प्रतीक्षा कर रहा है जो वर्तमान में दूसरे धागे द्वारा आयोजित किया जा रहा है। इसलिए, यह प्रतीक्षा थ्रेड उस ऑब्जेक्ट का उपयोग नहीं कर सकता है जब तक कि अन्य थ्रेड ने उस विशेष ऑब्जेक्ट को अनलॉक नहीं किया है।
कई जवाब ताला विवाद पर ध्यान केंद्रित करने के लिए लग रहे हैं, लेकिन ताले एकमात्र संसाधन नहीं हैं जिन पर विवाद का अनुभव किया जा सकता है। ध्यान बस तब होता है जब दो धागे या तो एक ही संसाधन या संबंधित संसाधनों को इस तरह से एक्सेस करने की कोशिश करते हैं कि कम से कम एक प्रतियोगी धागे की तुलना में अधिक धीमी गति से चलता है अगर अन्य धागा नहीं चल रहा होता।
विवाद का सबसे स्पष्ट उदाहरण एक ताला पर है। यदि थ्रेड ए में एक लॉक है और थ्रेड बी उसी लॉक को हासिल करना चाहता है, तो थ्रेड ए को लॉक जारी होने तक इंतजार करना होगा।
अब, यह प्लेटफ़ॉर्म-विशिष्ट है, लेकिन थ्रेड मंदी का अनुभव कर सकता है, भले ही उसे लॉक जारी करने के लिए दूसरे थ्रेड का इंतजार न करना पड़े! ऐसा इसलिए है क्योंकि एक ताला किसी प्रकार के डेटा की सुरक्षा करता है, और डेटा को अक्सर ही साथ ही संरक्षित किया जाएगा।
उदाहरण के लिए, एक थ्रेड पर विचार करें जो एक लॉक प्राप्त करता है, एक ऑब्जेक्ट को संशोधित करता है, फिर लॉक को रिलीज़ करता है और कुछ अन्य चीजें करता है। यदि दो धागे ऐसा कर रहे हैं, भले ही वे लॉक के लिए कभी न लड़ें, थ्रेड्स बहुत धीमी गति से चल सकते हैं, अगर वे केवल एक धागा चल रहा हो।
क्यों? मान लें कि प्रत्येक थ्रेड अपने स्वयं के कोर पर एक आधुनिक x86 CPU पर चल रहा है और कोर एक L2 कैश साझा नहीं करते हैं। केवल एक धागे के साथ, वस्तु ज्यादातर समय L2 कैश में बनी रह सकती है। दोनों थ्रेड चल रहे हैं, प्रत्येक बार एक थ्रेड ऑब्जेक्ट को संशोधित करता है, तो दूसरा थ्रेड डेटा को उसके L2 कैश में नहीं है क्योंकि अन्य CPU ने कैश लाइन को अमान्य कर दिया है। उदाहरण के लिए, पेंटियम डी पर, यह एफएसबी गति से कोड को चलाने का कारण बनेगा, जो कि एल 2 कैश गति से काफी कम है।
चूँकि विवाद तब भी हो सकता है जब ताला स्वयं के लिए विवादित न हो, ताला न होने पर विवाद भी हो सकता है। उदाहरण के लिए, मान लें कि आपका CPU 32-बिट चर के परमाणु वृद्धि का समर्थन करता है। यदि एक थ्रेड किसी वैरिएबल को बढ़ाता और घटाता रहता है, तो वेरिएबल बहुत समय तक कैश में गर्म रहेगा। यदि दो धागे ऐसा करते हैं, तो उनके कैश उस चर को धारण करने वाली मेमोरी के स्वामित्व के लिए संघर्ष करेंगे, और कई पहुंच धीमी हो जाएगी क्योंकि कैश कोरेन्सी प्रोटोकॉल कैश लाइन के प्रत्येक मुख्य स्वामित्व को सुरक्षित करने के लिए संचालित होता है।
विडंबना यह है कि ताले आमतौर पर विवाद को कम करते हैं । क्यों? क्योंकि लॉक के बिना, दो धागे एक ही वस्तु या संग्रह पर काम कर सकते हैं और बहुत सारे विवाद पैदा कर सकते हैं (उदाहरण के लिए, लॉक फ्री कतारें हैं)। ताले लड़ी जाने वाली लड़ियों को उखाड़ फेंकेंगे, जिससे गैर-लड़ी धागे को इसके बजाय चलने की अनुमति मिलेगी। यदि थ्रेड A लॉक रखता है और थ्रेड B वही लॉक चाहता है, तो कार्यान्वयन थ्रेड C को इसके स्थान पर चला सकता है। यदि थ्रेड सी को उस लॉक की आवश्यकता नहीं है, तो थ्रेड ए और बी के बीच भविष्य के विवाद को थोड़ी देर के लिए टाला जा सकता है। (बेशक, यह माना जाता है कि अन्य थ्रेड्स हैं जो चल सकते हैं। यह मदद नहीं करेगा यदि सिस्टम एक पूरे के रूप में एकमात्र तरीका उपयोगी प्रगति कर सकता है, जो कि थ्रेड्स को चलाकर दौड़ते हैं।)
से यहाँ :
एक विवाद तब होता है जब एक सूत्र एक संसाधन की प्रतीक्षा कर रहा है जो आसानी से उपलब्ध नहीं है; यह आपके कोड के निष्पादन को धीमा कर देता है, लेकिन समय के साथ साफ हो सकता है।
एक डेडलॉक तब होता है जब एक थ्रेड एक संसाधन के लिए प्रतीक्षा कर रहा होता है जो एक दूसरा थ्रेड लॉक किया गया है, और दूसरा थ्रेड एक संसाधन के लिए प्रतीक्षा कर रहा है जिसे पहले थ्रेड ने लॉक किया है। एक गतिरोध में दो से अधिक धागे शामिल हो सकते हैं। एक गतिरोध कभी भी हल नहीं होता है। यह अक्सर पूरे अनुप्रयोग या उस भाग का कारण बनता है जो गतिरोध का सामना कर रहा है, रुकने के लिए।
मुझे लगता है कि प्रश्न की पृष्ठभूमि पर ओपी से कुछ स्पष्टीकरण होना चाहिए - मैं 2 उत्तरों के बारे में सोच सकता हूं (हालांकि मुझे यकीन है कि इस सूची में कुछ अतिरिक्त हैं):
यदि आप थ्रेड कंटेस्टेंस के सामान्य "कॉन्सेप्ट" का जिक्र कर रहे हैं और यह अपने आप को किसी एप्लिकेशन में कैसे प्रस्तुत कर सकता है, तो मैं @ DavidSchwartz के विस्तृत उत्तर का उल्लेख करता हूं।
'.NET CLR लॉक और थ्रेड: कुल # सामग्री का प्रदर्शन काउंटर' भी है। इस काउंटर के लिए PerfMon विवरण से लिया गया है, इसे इस प्रकार परिभाषित किया गया है:
यह काउंटर प्रदर्शित करता है कि सीएलआर में कुल कितनी बार थ्रेड्स को प्रबंधित ताला प्राप्त करने का असफल प्रयास किया गया है। प्रबंधित ताले कई तरीकों से हासिल किए जा सकते हैं; C # में "लॉक" स्टेटमेंट द्वारा या System.Monitor.Enter को कॉल करके या MethodImplOptions.Synchronized कस्टम विशेषता का उपयोग करके।
... और मुझे यकीन है कि अन्य OS'es और अनुप्रयोग चौखटे के लिए दूसरों को।
एक और शब्द संक्षिप्त हो सकता है। यह केवल दो या अधिक थ्रेड्स का विचार है जो एक ही संसाधन का उपयोग करने की कोशिश कर रहा है।
निम्नलिखित परिदृश्य की कल्पना करें। आप कल की अंतिम परीक्षा की तैयारी कर रहे हैं और थोड़ी भूख महसूस कर रहे हैं। तो, आप अपने छोटे भाई को दस रुपये देते हैं और उसे आपके लिए पिज्जा खरीदने के लिए कहते हैं। इस मामले में, आप मुख्य धागा हैं और आपका भाई एक बच्चा धागा है। एक बार जब आपका आदेश दे दिया जाता है, तो आप और आपका भाई दोनों अपना काम समवर्ती रूप से कर रहे होते हैं (अर्थात, पिज़्ज़ा का अध्ययन और खरीदारी)। अब, हमारे पास विचार करने के लिए दो मामले हैं। सबसे पहले, आपका भाई आपके पिज्जा को वापस लाता है और जब आप पढ़ रहे होते हैं तब समाप्त हो जाते हैं। इस मामले में, आप अध्ययन को रोक सकते हैं और पिज्जा का आनंद ले सकते हैं। दूसरा, आप अपने अध्ययन को जल्दी खत्म करते हैं और सोते हैं (यानी, आज के लिए आपकी नियत नौकरी - कल की अंतिम परीक्षा के लिए अध्ययन - पिज्जा उपलब्ध होने से पहले)। बेशक, तुम सो नहीं सकते; अन्यथा, आपको पिज्जा खाने का मौका नहीं मिलेगा।
उदाहरण के रूप में, दो मामले प्रतिद्वंद्विता का अर्थ देते हैं।
ताला विवाद तब होता है जब एक धागा एक वस्तु को ताला प्राप्त करने की कोशिश करता है जो पहले से ही अन्य धागे * द्वारा अधिग्रहित किया जाता है। जब तक ऑब्जेक्ट जारी नहीं किया जाता है, तब तक थ्रेड अवरुद्ध है (दूसरे शब्दों में, यह प्रतीक्षा की स्थिति में है)। कुछ मामलों में, यह एक तथाकथित धारावाहिक निष्पादन को जन्म दे सकता है जो आवेदन को नकारात्मक रूप से प्रभावित करता है।