गतिरोध का पता लगाना


18

गतिरोध का पता लगाना

जब एक मल्टीथ्रेडिंग एप्लिकेशन को प्रोग्रामिंग करना हो तो साझा संसाधनों तक पहुँचने के दौरान विभिन्न थ्रेड्स को गतिरोध से बचाने के लिए अच्छी देखभाल करनी चाहिए। एक डेडलॉक तब होता है जब एक थ्रेड एक संसाधन पर पहुंचने का प्रयास करता है जो उसी समय दूसरे थ्रेड में बंद होता है, जबकि दूसरा थ्रेड पहले बंद किए गए संसाधन तक पहुंचने का प्रयास कर रहा है। यह सरल मामला है, लेकिन यह अधिक संसाधन श्रृंखलाओं के साथ अधिक जटिल हो सकता है।

चुनौती

आपको एक प्रोग्राम या फ़ंक्शन लिखना चाहिए जो प्रत्येक थ्रेड द्वारा एक्सेस किए गए संसाधनों की सूची में संभावित गतिरोध की स्थिति का पता लगा सकता है। यह कोड-गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा जवाब है।

प्रत्येक थ्रेड को एक ही समय में शुरू किया जाता है, लेकिन इसके बाद वे इंटरलेविंग के किसी भी संयोजन पर चल सकते हैं। वहाँ 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 में गतिरोध ।


http://pastebin.com/vMYRZxtW

उत्पादन false


http://pastebin.com/V5MVgNgS

उत्पादन true

b,d,aक्रमशः जलने की कोशिश करने पर थ्रेड्स में गतिरोध 1,2,3 ।


बेशक, यह बहुत अधिक जटिल हो सकता है, अधिक धागे के साथ, प्रत्येक के लिए अधिक संसाधन, और इसी तरह, लेकिन मेरा मानना ​​है कि ये परीक्षण मूल बातें कवर करते हैं।

बक्शीश

चूंकि यह बहुत दुखद है जब आप प्रोग्राम लिखते समय गतिरोध की स्थिति पाते हैं, तो आउटपुटिंग के जवाब के लिए :(और :)क्रमशः सत्य / मिथ्या के रूप में -8 बाइट बोनस है ।


मैं सिर्फ यह मान रहा हूं, लेकिन यह स्पष्ट करना अच्छा होगा कि प्रत्येक थ्रेड (थ्रेड के ऊपर से शुरू) की क्रियाएं समान रूप से चलती हैं और समान सिस्टम समय के अनुरूप होती हैं
ऑप्टिमाइज़र

1
क्रियाएं समवर्ती रूप से चलाई जाती हैं, लेकिन हर क्रिया को चलाने का समय ग्रहण नहीं किया जा सकता है। यह हो सकता है कि धागे वास्तव में एक के बाद एक कड़ाई से चलाए जा रहे हैं या पूरी तरह से interleaved हैं। यह हो सकता है कि थ्रेड 1 का पहला आधा भाग है, फिर थ्रेड 2 पूरी तरह से चलाया जाता है, फिर थ्रेड 1 रन दूसरा हाफ है। और इसी तरह। मैंने प्रश्न को स्पष्ट करने के लिए अद्यतन किया है।
rorlork

1
आह ठीक है, इसलिए कार्य यह पता लगाना है कि थ्रेड रन समय के किसी भी संभावित संयोजन को देखते हुए, क्या एक गतिरोध संभव है।
ऑप्टिमाइज़र

हाँ, क्षमा करें, मुझे नहीं लगा कि संदेह छोड़ सकता है। वास्तव में अंतिम उदाहरण में यह प्रदर्शित किया जाता है क्योंकि थ्रेड 2 dबाद तक संसाधन का उपयोग करने की कोशिश नहीं करता है ।
रॉलर्क

1
@ आर्केड आपको लगता है कि :)झूठे और :(सच्चे के लिए नहीं होना चाहिए ?
टायलो

जवाबों:


4

अजगर 2 - 227

मूल रूप से सुनिश्चित करता है कि 'पूर्वता' के कोई छोर नहीं हैं। दूसरे परीक्षण में उदाहरण के लिए, पहले धागे में एक a(b)मिसाल है और दूसरे धागे में एक b(a)मिसाल है।

मैं इसे पर्थ में फिर से लिखने के बारे में सोच रहा था क्योंकि मुझे लगता है कि यह सभी itertools संचालन के साथ अच्छी तरह से काम करेगा, लेकिन regex को परिवर्तित करने में कुछ काम लगेगा इसलिए अब मैं इसे पोस्ट करूंगा और हो सकता है कि इसे परिवर्तित करने का प्रयास करूं और बाद में किसी अन्य उत्तर को पोस्ट करूं।

from itertools import*
import re
f=lambda t:any(re.search(r"(.)((.)\3)+\1",''.join(p))for i in product(*[[m.group(1)+m.group(2)for m in re.finditer(r"(\w).*(\w).*\2.*\1",e,16)]for e in t.split('---')])for p in permutations(i))


@ टायलो यह मेरे लिए सच है; आप इसे कैसे चला रहे हैं?
केसाब

ओह यह मेरे लिए केवल एक पंक्ति पढ़ रहा था। आप इसे कैसे चला सकते हैं?
टायिलो

@ टिलो I ने प्रारूप को एक फ़ंक्शन के रूप में बदल दिया जो इनपुट के रूप में एक
बहुस्तरीय

5

पायथन - 586 539 524 501 485 बाइट्स - 8 = 477

संकेत स्तर:

1: 1 space
2: 1 tab
3: 1 tab + 1 space
4: 2 tabs

-

import sys
V=set()
t=[[[]]]
for r in sys.stdin:
 r=r.strip()
 if'---'==r:t.append([[]])
 else:v=r[1:];V.add(v);l=t[-1][-1];t[-1].append(l+[v]if'+'==r[0]else filter(lambda x:x!=v,l))
s=lambda l:s(l[1:])+map(lambda x:(l[0],x),l[1:])if 1<len(l)else[]
E=reduce(set.union,map(lambda x:set(sum(map(s,x),[])),t),set())
for v in V:
 k=set();q=[v]
 while 0<len(q):
    u=q.pop(0)
    if u in k:continue
    k.add(u)
    for x,y in E:
     if u==x:
        if y in k:print':(';sys.exit()
        else:q.append(y)
print':)'

1
;वर्णों को सहेजने के लिए प्रेरित लाइनों को संयोजित करने के लिए उपयोग करें । इसी तरह, अपने बयानों को एक लाइनर बनाएं।
इसहाक

@isaacg और इक्का, धन्यवाद! मुझे लगता है कि मैंने आपके सुझावों का उपयोग करते हुए इसे बेहतर बनाया।
टायलो

BTW अगर आपको किसी फ़ाइल से इनपुट को पाइप करने में कोई दिक्कत नहीं है (या दो बार Ctrl + D दबाकर) तो आप for r in sys.stdinइसके बजाय कर सकते हैंfor r in sys.stdin.readlines()
user12205

@ace मुझे बस sys.stdinया का उपयोग करने के बीच कोई अलग व्यवहार नहीं दिखता है sys.stdin.readlines(), इसलिए मैंने इसे बदल दिया है, फिर से धन्यवाद।
टायरो

आप के बीच रिक्त स्थान को हटा सकते हैं printऔर':)'
user12205
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.