2013-03-12 9 views
15

में कैसे रोकें, मैंने सिर्फ 5 मिनट पहले साक्षात्कार किया था, मैंने 3 प्रश्नों का उत्तर नहीं दिया, क्या कोई मेरी मदद कर सकता है।डेडलॉक को कैसे ढूंढें और इसे सी #

प्रश्न:

कैसे थ्रेड आवेदन समारोह में गतिरोध परिदृश्यों के लिए लग रही है और यह को रोकने के लिए?

जवाब मैं दे दिया:

मैं गतिरोध और लॉक, म्युटेक्स, निगरानी, ​​सेमाफोर की परिभाषा दे दी है। उसने मुझसे कहा, कि इन उपकरणों रहे हैं, लेकिन क्योंकि जब हम इन उपकरणों का उपयोग आँख बंद करके के रूप में एक गतिरोध परिदृश्य के लिए देखने के लिए कैसे, यह प्रदर्शन उन्होंने कहा :(

कृपया मेरी मदद इस बात को समझ खर्च होता है।

+3

आप एक बहुत कॉम्पैक्ट जवाब के बारे में सोच नहीं सकते ताला पैटर्न का विश्लेषण करने के लिए होगा ...। –

+2

वह डेडलॉक की जांच करने के लिए एक सामान्य तरीका मांग रहा था? मुझे पता है कि कोड को देखकर और कुछ खुफिया जानकारी का उपयोग करके ... – TheKingDave

+0

डेडलॉक्स को रोकने के लिए, आपको लॉकफ्री कार्यान्वयन का उपयोग करना होगा। यदि आपको ताले रखने की पूरी तरह से आवश्यकता है, तो आपको यह सुनिश्चित करना होगा कि जब भी कई ताले की आवश्यकता हो, तो आपके द्वारा लॉक की गई वस्तुओं को एक अच्छी तरह परिभाषित क्रम में बंद कर दिया जाता है। – Nolonar

उत्तर

5

प्रदर्शन विश्लेषण उपकरण दूसरों के बीच डेडलॉक्स की पहचान करने में भी सहायक हो सकते हैं। यह प्रश्न इस विषय में कुछ अंतर्दृष्टि प्रदान करेगा: C#/.NET analysis tool to find race conditions/deadlocks

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

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

लॉकिंग के लिए केवल कुछ लॉक करना प्रदर्शन को प्रभावित करता है, क्योंकि थ्रेड एक दूसरे के लिए प्रतीक्षा करते हैं। आपको किस प्रकार लॉक (सरल lock या शायद Readerwriterlockslim) के साथ, वास्तव में लॉक होने की आवश्यकता है, यह निर्धारित करने के लिए वर्कफ़्लो का विश्लेषण करना होगा। डेडलॉक को रोकने के लिए कई युक्तियां हैं।

उदाहरण के लिए जब Readerwriterlockslim का उपयोग कर आप एक समय समाप्ति (यदि आप ज्यादा के लिए इंतजार, तो आपको लॉक प्राप्त abord) का उपयोग कर सकते गतिरोध को रोकने के लिए http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

if (cacheLock.TryEnterWriteLock(timeout)) 
{ 
... 
} 

और आप इस तरह के समय समाप्ति सुझाव देने के लिए सक्षम होना चाहिए।

इस तरह के एक प्रश्न पर मैं कम से कम घोंसले के क्लासिक मामले का उल्लेख करता हूं, जैसे नेस्टेड ताले का बुरी तरह उपयोग (आपको पता होना चाहिए कि आप उनसे कैसे बच सकते हैं, वे बुरे क्यों हैं आदि)।

विषय बहुत बड़ा है ... आप इस बारे में और आगे जा सकते हैं। लेकिन निश्चितता के बिना। यह जानना कि लॉक क्या है और बड़े पैमाने पर बहु-थ्रेडिंग अनुप्रयोगों में ताले/सेमफोर/म्यूटेक्स का उपयोग करने के बारे में जानना 2 अलग-अलग चीजें हैं।

+0

धन्यवाद कोरल, प्रदर्शन विश्लेषण के लिए टूल जानने के बारे में मेरे लिए एक नया ज्ञान है, उस लिंक पर एक नज़र डालेगा :) धन्यवाद ... चीयर्स – Learner

0

सरलतम इस समस्या का समाधान हमेशा पर्याप्त समय के साथ सोना/इंतजार करना होगा। अगर वह समय समाप्ति होता है तो आप जानते हैं कि इससे कुछ लंबा रास्ता तय हो गया है और आपके पास डेडलॉक या अन्य बग का अच्छा मौका है।

Mutex m; // similar overloads exist for all locking primitives 
if (!m.WaitOne(TimeSpan.FromSeconds(30))) 
    throw new Exception("Potential deadlock detected."); 

जब WaitOnefalse देता है तो यह 30 सेकंड और लॉक स्टिल का इंतजार करेगा मैं जारी नहीं किया गया था। यदि आप जानते हैं कि सभी लॉक किए गए परिचालनों को मिलीसेकंड के भीतर पूरा करना चाहिए (यदि नहीं, तो बस टाइमआउट बढ़ाएं), तो यह एक बहुत अच्छा संकेत है कि कुछ बुरी तरह से चला गया।

+0

डेडलॉक और भुखमरी के बीच अंतर कैसे बताता है ? – Nolonar

+0

हाय हनागिस, उत्तर के लिए धन्यवाद, मुझे डर है कि मैं समझ नहीं पा रहा हूं कि आप क्या कहते हैं :(मैं बहुसंख्यक के लिए नया हूं :(मुझे खेद है, अगर आप जो भी कर सकते हैं तो यह बहुत अच्छा होगा कहने की कोशिश कर रहे हैं :( – Learner

+1

वह एक म्यूटेक्स पर टाइमआउट सेट कर रहा है। इसका मतलब है कि यह जारी रखने से पहले 30 सेकंड तक इंतजार करेगा। यदि यह समय समाप्त हो जाता है तो फ़ंक्शन झूठा हो जाएगा और इसलिए वह जान सकता है कि किसी ने म्यूटेक्स को पंप नहीं किया है। पर्याप्त लंबे समय के साथ यह * * डेडलॉक मतलब हो सकता है। यहां कीवर्ड हो सकता है। यह हमेशा डेडलॉक का मतलब नहीं है। – devshorts

4

मुझे लगता है कि साक्षात्कार आपको एक चाल प्रश्न पूछ रहा है। यदि आप डेडलॉक को रोकने के लिए स्थिर विश्लेषण का उपयोग कर सकते हैं ... कोई भी डेडलॉक नहीं होगा!

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

void func(){ 
    lock(_lock){ 
     func2(); 
    } 
} 

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

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

आप लॉक फ्री डेटा संरचनाओं का उपयोग करके डेडलॉक्स से भी बच सकते हैं (लेकिन उनको केवल इतना उपयोग करने की आवश्यकता है)। आप लॉक फ्री स्ट्रक्चर तक अपनी पहुंच को कम करना चाहते हैं क्योंकि हर बार जब आप इसे एक्सेस करते हैं तो यह बदल सकता है।

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

मैं आपके साक्षात्कार से सहमत नहीं हूं कि ताले हमेशा एक बड़ी प्रदर्शन समस्या जोड़ें। अनचाहे ताले/म्यूटेक्स/आदि ओएस और स्पिनलॉक्स को सौंपने से पहले स्पिनलॉक के रूप में पहले परीक्षण सस्ते होते हैं।

सामान्य रूप से, डेडलॉक से बचने का सबसे अच्छा तरीका है अपने कार्यक्रम प्रवाह को समझना। प्रत्येक बार जब आप एक नया लॉक ऑब्जेक्ट पेश करते हैं, तो इस बारे में सोचें कि इसका उपयोग कहां किया जाता है और यह श्रृंखला के नीचे क्या उपयोग करता है।

+0

आपके स्पष्टीकरण के लिए धन्यवाद, यह मेरे लिए बहुत बड़ी जानकारी है :) चीयर्स – Learner

6

ऐसा लगता है कि आपको यह बताते हुए समस्याएं थीं कि डेडलॉक्स कैसे हो सकते हैं और उन्हें कैसे रोका जा सकता है।

डेडलॉक तब होता है जब दो में से प्रत्येक (मिनीमुन दो) धागे पहले से लॉक संसाधन पर लॉक प्राप्त करने का प्रयास करते हैं। संसाधन 1 पर लॉक 1 थ्रेड संसाधन 2 पर लॉक प्राप्त करने का प्रयास करता है। साथ ही, थ्रेड 2 में संसाधन 2 पर लॉक होता है और यह संसाधन 1 पर लॉक प्राप्त करने का प्रयास करता है। दो धागे कभी भी अपने ताले नहीं छोड़ते हैं, इसलिए एक डेडलॉक अवसर ।

डेडलॉक से बचने का सबसे आसान तरीका टाइमआउट मान का उपयोग करना है। मॉनिटर क्लास (system.Threading.Monitor) लॉक प्राप्त करने के दौरान एक टाइमआउट सेट कर सकता है।

उदाहरण

try{ 
    if(Monitor.TryEnter(this, 500)) 
    { 
     // critical section 
    } 
} 
catch (Exception ex) 
{ 

} 
finally 
{ 
    Monitor.Exit(); 
} 

Read More

+0

धन्यवाद गारह, जो मेरी मदद करता है, इस पर और अधिक पता लगाएगा :) चीयर्स – Learner

+0

जिज्ञासा से बाहर, ब्लॉक के बाद आप कैच का उपयोग कैसे कर रहे हैं? या यह सिर्फ एक छद्म कोड है। WinCE (.net compacFframework) पर, मैं मॉनिटर में टाइमआउट के बिना केवल ऑब्जेक्ट पास कर सकता हूं। ट्राइंटर। क्या टाइमआउट के साथ अपना कार्यान्वयन लिखने का कोई तरीका है? –

+0

@RomaBorodov ऐसा लगता है जैसे मैंने कोशिश छोड़ दी। अच्छी पकड़! फिक्स्ड। –

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