मुझे लगता है कि साक्षात्कार आपको एक चाल प्रश्न पूछ रहा है। यदि आप डेडलॉक को रोकने के लिए स्थिर विश्लेषण का उपयोग कर सकते हैं ... कोई भी डेडलॉक नहीं होगा!
व्यक्तिगत रूप से, जब मैं डेडलॉक की तलाश करता हूं तो मैं उन कार्यों को ढूंढकर शुरू करता हूं जहां महत्वपूर्ण अनुभाग फ़ंक्शन कॉल से अधिक होता है। उदाहरण के लिए
void func(){
lock(_lock){
func2();
}
}
यह वास्तव में स्पष्ट नहीं है कि func2
क्या कर रहा है। हो सकता है कि यह एक ही धागे पर एक घटना भेजता है, जिसका अर्थ यह होगा कि घटना अभी भी महत्वपूर्ण खंड का हिस्सा है। शायद यह अलग लॉक पर लॉक हो जाता है। हो सकता है कि यह थ्रेडपूल में भेजता है और अब फिर से प्रवेश नहीं कर रहा है क्योंकि अब यह एक अलग थ्रेड पर है! इस तरह के स्थान हैं जहां आप डेडलॉक परिदृश्यों को देखना शुरू कर सकते हैं: जब आपके पास एकाधिक गैर-पुनर्विक्रेता लॉक स्थान होते हैं।
अन्य बार, डेडलॉक परिदृश्यों का पता लगाने के दौरान, मैं बैकट्रैक करता हूं और मैं कोशिश करता हूं और ढूंढता हूं कि सभी धागे कहां बनाए गए हैं। मैं प्रत्येक समारोह को सोचा और वास्तव में यह कहां चल रहा है। यदि आप निश्चित नहीं हैं, तो लॉग इन करने के लिए लॉग इन करना जहां लॉग इन कॉल आया था, भी मदद कर सकता है।
आप लॉक फ्री डेटा संरचनाओं का उपयोग करके डेडलॉक्स से भी बच सकते हैं (लेकिन उनको केवल इतना उपयोग करने की आवश्यकता है)। आप लॉक फ्री स्ट्रक्चर तक अपनी पहुंच को कम करना चाहते हैं क्योंकि हर बार जब आप इसे एक्सेस करते हैं तो यह बदल सकता है।
जैसा कि किसी अन्य उत्तर में बताया गया है, आप टाइमआउट के साथ म्यूटेक्स का उपयोग कर सकते हैं, लेकिन यह हमेशा काम करने की गारंटी नहीं है (क्या होगा यदि आपके कोड को टाइमआउट से अधिक समय तक काम करने की आवश्यकता है?)। यह एक और टिप्पणी में उल्लेख किया गया था कि यह शायद साक्षात्कारकर्ता क्या पूछ रहा था। मुझे लगता है कि उत्पादन में यह वास्तव में एक अच्छा विचार नहीं है। टाइमआउट हर समय अलग-अलग होते हैं, शायद कुछ समय के लिए दौड़ने और हिट करने की अपेक्षा से अधिक समय लगता है। मुझे लगता है कि इसे डेडलॉक करने के लिए बेहतर है, एक प्रक्रिया डंप लें, फिर ताले पकड़ने और समस्या को ठीक करने के लिए वास्तव में पता लगाएं। बेशक, यदि आपकी व्यावसायिक आवश्यकताएं इसकी अनुमति नहीं दे सकती हैं, तो आप इसे स्मार्ट लॉक प्लेसमेंट विकल्पों के साथ रक्षात्मक कोडिंग रणनीति के हिस्से के रूप में उपयोग कर सकते हैं।
मैं आपके साक्षात्कार से सहमत नहीं हूं कि ताले हमेशा एक बड़ी प्रदर्शन समस्या जोड़ें। अनचाहे ताले/म्यूटेक्स/आदि ओएस और स्पिनलॉक्स को सौंपने से पहले स्पिनलॉक के रूप में पहले परीक्षण सस्ते होते हैं।
सामान्य रूप से, डेडलॉक से बचने का सबसे अच्छा तरीका है अपने कार्यक्रम प्रवाह को समझना। प्रत्येक बार जब आप एक नया लॉक ऑब्जेक्ट पेश करते हैं, तो इस बारे में सोचें कि इसका उपयोग कहां किया जाता है और यह श्रृंखला के नीचे क्या उपयोग करता है।
आप एक बहुत कॉम्पैक्ट जवाब के बारे में सोच नहीं सकते ताला पैटर्न का विश्लेषण करने के लिए होगा ...। –
वह डेडलॉक की जांच करने के लिए एक सामान्य तरीका मांग रहा था? मुझे पता है कि कोड को देखकर और कुछ खुफिया जानकारी का उपयोग करके ... – TheKingDave
डेडलॉक्स को रोकने के लिए, आपको लॉकफ्री कार्यान्वयन का उपयोग करना होगा। यदि आपको ताले रखने की पूरी तरह से आवश्यकता है, तो आपको यह सुनिश्चित करना होगा कि जब भी कई ताले की आवश्यकता हो, तो आपके द्वारा लॉक की गई वस्तुओं को एक अच्छी तरह परिभाषित क्रम में बंद कर दिया जाता है। – Nolonar