गतिरोध का पता लगाना
जब एक मल्टीथ्रेडिंग एप्लिकेशन को प्रोग्रामिंग करना हो तो साझा संसाधनों तक पहुँचने के दौरान विभिन्न थ्रेड्स को गतिरोध से बचाने के लिए अच्छी देखभाल करनी चाहिए। एक डेडलॉक तब होता है जब एक थ्रेड एक संसाधन पर पहुंचने का प्रयास करता है जो उसी समय दूसरे थ्रेड में बंद होता है, जबकि दूसरा थ्रेड पहले बंद किए गए संसाधन तक पहुंचने का प्रयास कर रहा है। यह सरल मामला है, लेकिन यह अधिक संसाधन श्रृंखलाओं के साथ अधिक जटिल हो सकता है।
चुनौती
आपको एक प्रोग्राम या फ़ंक्शन लिखना चाहिए जो प्रत्येक थ्रेड द्वारा एक्सेस किए गए संसाधनों की सूची में संभावित गतिरोध की स्थिति का पता लगा सकता है। यह कोड-गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा जवाब है।
प्रत्येक थ्रेड को एक ही समय में शुरू किया जाता है, लेकिन इसके बाद वे इंटरलेविंग के किसी भी संयोजन पर चल सकते हैं। वहाँ 4 कार्यों प्रत्येक के साथ 2 धागे हैं, यह के रूप में (जहां प्रत्येक संख्या कि आईडी के साथ धागा द्वारा की जाने वाली क्रिया है) चलाया जा सकता है 1,1,1,1,2,2,2,2
, 2,2,2,2,1,1,1,1
, 1,2,1,2,1,2,1,2
, 1,1,2,2,2,2,1,1
, या किसी अन्य संभव संयोजन।
इनपुट
आप एसटीडीआईएन, फ़ंक्शन पैरामीटर या निकटतम विकल्प के माध्यम से प्राप्त करेंगे, तार की एक सूची। प्रत्येक स्ट्रिंग प्रारूप में होगी +a
-b
। इस स्ट्रिंग्स में से हर एक थ्रेड द्वारा संसाधन के लॉकिंग ( +
) / अनलॉकिंग ( -
) का प्रतिनिधित्व करता है । हर धागे के बीच एक ---
विभाजक होगा। यह गारंटी दी जाती है कि एक धागा एक संसाधन को लॉक करने की कोशिश नहीं करेगा जो पहले से ही बंद है, और यह कि सभी धागे स्पष्ट रूप से बाहर निकलने से पहले बंद किए गए सभी संसाधनों को अनलॉक करेंगे। निम्नलिखित एक उदाहरण प्रदर्शित करने के लिए है:
+a # Lock resource a
+b # Lock resource b
-a # Unlock resource a
-b # Unlock resource b
--- # Thread separator
+b # Lock resource b
-b # Unlock resource b
उत्पादन
यदि इनपुट में कोई डेडलॉक संभावना नहीं है, तो आउटपुट गलत हो सकता है और यदि संभव गतिरोध की स्थिति हो तो सत्य है। उदाहरण के लिए:
true
false
1
0
सभी मान्य आउटपुट हैं, लेकिन कुछ भी स्पष्ट रूप से सत्य / मिथ्या के रूप में परिभाषित किया जाएगा।
उदाहरण
+a
-a
---
+a
-a
आउटपुट: false
+a
+b
-b
-a
---
+b
+a
-a
-b
उत्पादन true
b,a
थ्रेड के लिए क्रमशः अधिग्रहित करने का प्रयास करते समय गतिरोध1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
उत्पादन false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
आउटपुट: true
b,c,a
क्रमशः प्राप्त करने की कोशिश करते समय थ्रेड्स 1,2,3 में गतिरोध ।
उत्पादन false
उत्पादन true
b,d,a
क्रमशः जलने की कोशिश करने पर थ्रेड्स में गतिरोध 1,2,3 ।
बेशक, यह बहुत अधिक जटिल हो सकता है, अधिक धागे के साथ, प्रत्येक के लिए अधिक संसाधन, और इसी तरह, लेकिन मेरा मानना है कि ये परीक्षण मूल बातें कवर करते हैं।
बक्शीश
चूंकि यह बहुत दुखद है जब आप प्रोग्राम लिखते समय गतिरोध की स्थिति पाते हैं, तो आउटपुटिंग के जवाब के लिए :(
और :)
क्रमशः सत्य / मिथ्या के रूप में -8 बाइट बोनस है ।
d
बाद तक संसाधन का उपयोग करने की कोशिश नहीं करता है ।
:)
झूठे और :(
सच्चे के लिए नहीं होना चाहिए ?