অচলাবস্থার সন্ধান করা


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, বা অন্য কোন সম্ভাব্য সংমিশ্রণ।

ইনপুট

আপনি STDIN, ফাংশন প্যারামিটার বা নিকটতম বিকল্পের মাধ্যমে স্ট্রিংয়ের একটি তালিকা পাবেন। প্রতিটি স্ট্রিং বিন্যাসে হবে +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 থ্রেডে অ্যাকডায়ার করার সময় ডেডলক ।


অবশ্যই এটি আরও অনেক থ্রেড, প্রত্যেকের জন্য আরও সংস্থান এবং আরও অনেক জটিল হয়ে উঠতে পারে তবে আমি বিশ্বাস করি যে এই পরীক্ষাগুলি বেসিকগুলি অন্তর্ভুক্ত করে।

বোনাস

যেহেতু এটা খুব খুব দু: খিত যখন আপনি অচলাবস্থা পরিস্থিতিতে যখন একটি প্রোগ্রাম লেখা খুঁজে সেখানে outputting উত্তর করার জন্য একটি -8 বাইট বোনাস হিসেবে রয়েছে :(এবং :)truthy / falsy যথাক্রমে।


আমি কেবল এটি ধরে নিচ্ছি, তবে এটি স্পষ্ট করে বলতে ভাল লাগবে যে প্রতিটি থ্রেডের ক্রিয়াকলাপ (থ্রেডের শীর্ষ থেকে শুরু করে) সমান্তরালভাবে সঞ্চালিত হয় এবং একই সিস্টেম সময়ের সাথে সামঞ্জস্য হয়
অপ্টিমাইজার

1
ক্রিয়াগুলি একই সাথে পরিচালিত হয়, তবে প্রতিটি ক্রিয়াটি যে সময় চালিত হয় তা অনুমান করা যায় না। এটি ঘটতে পারে যে থ্রেডগুলি একের পর এক সম্পূর্ণ কঠোরভাবে চালিত হয় বা সম্পূর্ণ আন্তঃবিহীন হয়। এটি হতে পারে যে থ্রেড 1 এর প্রথমার্ধটি চালিত হয়, তারপরে থ্রেড 2 সম্পূর্ণ চালিত হয়, তারপরে থ্রেড 1 রান হয় এটি দ্বিতীয়ার্ধে। ইত্যাদি। আমি বিষয়টি পরিষ্কার করতে প্রশ্ন আপডেট করেছি।
রোরলর্ক

1
আহ ঠিক আছে, সুতরাং কাজটি নির্ধারণ করা যে থ্রেড রানের সময়গুলির যে কোনও সম্ভাব্য সংমিশ্রণ প্রদত্ত, কোনও অচলাবস্থা সম্ভব কিনা।
অপটিমাইজার

হ্যাঁ, দুঃখিত, আমি মনে করি না যে এটি সন্দেহ ছেড়ে দিতে পারে। প্রকৃতপক্ষে সর্বশেষ উদাহরণে এটি প্রদর্শিত হয় যেহেতু থ্রেড 2 dপরবর্তীকালে সংস্থান ব্যবহারের চেষ্টা করে না ।
রোরলর্ক

1
@rcrmn আপনি কি নিশ্চিত যে :)মিথ্যা এবং :(সত্যের জন্য হওয়া উচিত নয় ?
Tyilo

উত্তর:


4

পাইথন 2 - 227

মূলত নিশ্চিত করে তোলে যে 'অগ্রাধিকার' এর কোনও লুপ নেই। দ্বিতীয় পরীক্ষায় উদাহরণস্বরূপ, প্রথম থ্রেডের একটি a(b)প্রাধান্য রয়েছে এবং দ্বিতীয় থ্রেডের একটি b(a)প্রাধান্য রয়েছে।

আমি পাইথটিতে এটি পুনরায় লেখার বিষয়ে ভাবছিলাম কারণ আমি মনে করি এটি সমস্ত ইটারটোল অপারেশনগুলির সাথে ভালভাবে কাজ করবে, তবে রেজেক্সকে রূপান্তর করতে কিছু কাজ লাগবে তাই আপাতত আমি এটি পোস্ট করব এবং সম্ভবত এটি রূপান্তর করার চেষ্টা করব এবং পরে অন্য উত্তর পোস্ট করব।

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))

এটি উত্তর পেস্টবিন.
com

@ টিইলো এটি আমার পক্ষে সত্য; ঠিক কীভাবে আপনি এটি চালাচ্ছেন?
কেস্যাব 24:38

ওহ এটি আমার জন্য কেবল একটি লাইন পড়ছিল। আপনি এটি চালানোর কথা?
টাইলো

@ টিইলো আমি ফর্ম্যাটটি একটি ফাংশন হিসাবে পরিবর্তিত করেছি যা ইনপুট হিসাবে একাধিক স্ট্রিং নেয়
কেএসব

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

@ আইস্যাক এবং এস, ধন্যবাদ! আমি মনে করি আপনার টিপসটি ব্যবহার করে আমি যতটা সম্ভব এটি উন্নত করেছি।
Tyilo

বিটিডাব্লু যদি আপনি কোনও ফাইল থেকে ইনপুট পাইপ করতে (বা Ctrl + D দুবার for r in sys.stdinfor r in sys.stdin.readlines()
টিপতে

@ কেবল মাত্র sys.stdinবা ব্যবহারের মধ্যে আমি কোনও ভিন্ন আচরণ দেখতে পাচ্ছি না sys.stdin.readlines(), তাই আমি এটি পরিবর্তন করেছি, আবারও ধন্যবাদ।
টাইলো

আপনি মধ্যে শূণ্যস্থান অপসারণ করতে পারেন printএবং':)'
user12205
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.