यह इस बात पर निर्भर करता है कि ताले कैसे लागू होते हैं। यदि आप इसे विकिपीडिया लेख में करते हैं, अर्थात प्रति प्रक्रिया एक बूलियन के साथ महत्वपूर्ण खंड की रखवाली करना, तो आप निश्चित रूप से परेशानी में हैं। यदि एक प्रक्रिया मर जाती है, तो यह कभी अपने झंडे को रीसेट नहीं करता है, इसलिए दूसरी प्रक्रिया हमेशा के लिए बंद हो जाती है।
व्यवहार में, आप मरने के कई तरीकों के खिलाफ अपने कोड को सुरक्षित रख सकते हैं। उदाहरण के लिए, इस जावा-शैली के कार्यान्वयन को लें:
flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
// critical section
}
finally {
flag[1] = false;
}
यह सुनिश्चित करेगा कि महत्वपूर्ण खंड में जो कुछ भी हो, ध्वज को रीसेट कर दिया जाए, जब तक कि सिस्टम त्रुटि को संभाल रहा है। जावा में, स्टैक और हीप ओवरफ्लो के लिए भी यह सच है। तो जब तक यह प्रक्रिया वस्तुतः गायब नहीं हो जाती ( kill
², प्रोसेसर विफलता, नेटवर्क डिस्कनेक्ट, ...) आप सुरक्षित हैं। ध्यान दें कि अधिकांश गैर-महत्वपूर्ण सॉफ़्टवेयर इन मामलों में विफल रहता है - यह एक त्रुटि को कैसे संभाल सकता है जो यह नहीं चल रहा है? - ताकि कई मामलों में स्वीकार किया जा सके। यदि आवश्यक हो तो आप पुनः आरंभ करने पर विसंगतियों को संभाल सकते हैं।
यदि आप उचित, भाषा-स्तर के ताले का उपयोग करते हैं, तो रनटाइम सिस्टम गायब हो जाने वाले लॉक मालिकों को संभाल सकता है, अर्थात मृत मालिकों के साथ लॉक जारी कर सकता है। आप प्रत्येक प्रक्रिया को एक मृत आदमी के स्विच को दे सकते हैं, जिसे दूसरे पढ़ सकते हैं, या सीधे देख सकते हैं कि क्या लॉक ऑनिंग प्रक्रिया अभी भी जीवित है (यदि सिस्टम इसका समर्थन करता है) देकर इसे स्वयं अनुकरण कर सकता है।
- वैसे भी इसका कोई पैमाना नहीं होता।
- जावा में, मुझे लगता है कि इस
finalize
पर भी अमल करना चाहिए kill
, लेकिन यह युक्ति से अनुमान नहीं है। kill -9
शायद किसी भी समाधान के लिए मौत की सजा है जिसे कुछ करने के लिए मरने की प्रक्रिया की आवश्यकता होती है।