रूबी, 39 अक्षर
T=Thread;t=T.current;T.new{t.join}.join
जोहानस कुह्न के जावा जवाब से बेशर्मी से चुराए गए क्रॉस-जॉइन का उपयोग करने का विचार ।
यदि हम किसी विशिष्ट वातावरण में कोड को ट्यून करते हैं तो हम चार वर्णों ( 35 तक ) को शेव कर सकते हैं। JRuby का कंसोल IRB सिंगल-थ्रेडेड है:
T=Thread;T.new{T.list[0].join}.join
यह मेरा पिछला समाधान है:
म्यूटेक्स पर एक धागा फंसना आसान है:
m=Mutex.new;2.times{Thread.new{m.lock}}
लेकिन यह एक उचित गतिरोध नहीं है, क्योंकि दूसरा धागा तकनीकी रूप से पहले धागे की प्रतीक्षा नहीं कर रहा है। विकिपीडिया के अनुसार गतिरोध के लिए "पकड़ और प्रतीक्षा" एक परिमेय स्थिति है। पहला धागा प्रतीक्षा नहीं करता है, और दूसरा धागा कुछ भी पकड़ में नहीं आता है।
माणिक, 97 95 अक्षर
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
यह एक क्लासिक गतिरोध है। दो सूत्र दो संसाधनों के लिए प्रतिस्पर्धा करते हैं, अगर वे सफल होते हैं तो फिर से प्रयास करते हैं। आम तौर पर वे मेरी मशीन पर एक सेकंड के भीतर फंस जाते हैं।
लेकिन, यदि असीम रूप से कई थ्रेड्स (जिनमें से कोई भी सीपीयू असीम रूप से खपत करता है और जिनमें से कुछ गतिरोध है) ठीक है,
माणिक, 87 85 अक्षर
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
मेरे परीक्षण के अनुसार, यह थ्रेड काउंट लगभग 4700 तक पहुंचने के बाद विफल हो जाता है। उम्मीद है कि यह तब तक विफल नहीं होगा जब तक कि प्रत्येक थ्रेड को चलाने का मौका नहीं मिलता (इस प्रकार या तो गतिरोध या परिष्करण और एक नए के लिए स्थान खाली करना)। मेरे परीक्षण के अनुसार, विफलता होने के बाद थ्रेड काउंट नहीं गिरता है, जिसका अर्थ है कि परीक्षण के दौरान गतिरोध हुआ था। इसके अलावा, परीक्षण के बाद आईआरबी की मृत्यु हो गई।