অচলাবস্থার সন্ধান করা
একটি মাল্টিথ্রেডিং অ্যাপ্লিকেশন প্রোগ্রাম করার সময় ভাগ করা সংস্থানগুলিতে অ্যাক্সেস করার সময় বিভিন্ন থ্রেডকে অচল করে দেওয়া এড়াতে অবশ্যই ভাল যত্ন নিতে হবে। একটি অচলাবস্থা দেখা দেয় যখন একটি থ্রেড প্রচেষ্টা একটি সম্পদ যে একই সময় অন্য থ্রেড একটি সম্পদ প্রথম দ্বারা লক অ্যাক্সেস করার চেষ্টা করছে অন্য থ্রেড লক এর অ্যাক্সেস করতে। এটি সাধারণ ক্ষেত্রে, তবে এটি দীর্ঘ সংস্থার চেইনগুলির সাথে আরও জটিল হয়ে উঠতে পারে।
চ্যালেঞ্জ
আপনার এমন একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা প্রতিটি থ্রেড দ্বারা অ্যাক্সেস করা সংস্থানগুলির তালিকায় একটি সম্ভাব্য অচলাবস্থার পরিস্থিতি সনাক্ত করতে পারে। এটি কোড-গল্ফ, তাই বাইট জেতে সংক্ষিপ্ত উত্তর।
প্রতিটি থ্রেড একই সাথে শুরু করা হয় তবে এর পরে তারা ইন্টারলেভেয়ের যে কোনও সংমিশ্রণে চলতে পারে। সেখানে 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 থ্রেডে অচল ।
আউটপুট false
আউটপুট true
b,d,a
যথাক্রমে 1,2,3 থ্রেডে অ্যাকডায়ার করার সময় ডেডলক ।
অবশ্যই এটি আরও অনেক থ্রেড, প্রত্যেকের জন্য আরও সংস্থান এবং আরও অনেক জটিল হয়ে উঠতে পারে তবে আমি বিশ্বাস করি যে এই পরীক্ষাগুলি বেসিকগুলি অন্তর্ভুক্ত করে।
বোনাস
যেহেতু এটা খুব খুব দু: খিত যখন আপনি অচলাবস্থা পরিস্থিতিতে যখন একটি প্রোগ্রাম লেখা খুঁজে সেখানে outputting উত্তর করার জন্য একটি -8 বাইট বোনাস হিসেবে রয়েছে :(
এবং :)
truthy / falsy যথাক্রমে।
d
পরবর্তীকালে সংস্থান ব্যবহারের চেষ্টা করে না ।
:)
মিথ্যা এবং :(
সত্যের জন্য হওয়া উচিত নয় ?