Ruby, 39 karakter
T=Thread;t=T.current;T.new{t.join}.join
Johannes Kuhn'un Java cevabından utanmadan çalınan çapraz birleştirme kullanma fikri .
Kodu belirli bir ortama ayarlarsak dört karakteri tıraş edebiliriz (en fazla 35 karakter ). JRuby'nin IRB konsolu tek iş parçacıklı:
T=Thread;T.new{T.list[0].join}.join
Bu benim önceki çözümüm:
bir muteks sıkışmış bir iplik almak kolaydır:
m=Mutex.new;2.times{Thread.new{m.lock}}
ancak bu uygun bir kilitlenme değildir, çünkü ikinci iş parçacığı teknik olarak ilk iş parçacığını beklemez. "bekle ve bekle" Wikipedia'ya göre bir kilitlenme için gerekli bir koşuldur. İlk iş parçacığı beklemiyor ve ikinci iş parçacığı hiçbir şey tutmuyor.
Yakut, 97 95 karakter
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
bu klasik bir kilitlenme. İki iş parçacığı iki kaynak için yarışır, başarılı olursa yeniden dener. Normalde makineme bir saniye içinde takılırlar.
Ancak, sonsuz sayıda iş parçacığı (hiçbiri CPU'yu sonsuz olarak tüketmeyen ve bazıları kilitlenmeyen) varsa,
Yakut, 87 85 karakter
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
Testime göre, iplik sayısı yaklaşık 4700'e ulaştıktan sonra başarısız oluyor. Umarım her bir iş parçacığının çalışma şansı bulana kadar başarısız olmaz (böylece ya kilitlenme ya da bitirme ve yenisi için alan boşaltma). Testime göre, hata oluştuktan sonra iplik sayısı düşmez, yani test sırasında bir kilitlenme meydana gelir. Ayrıca, IRB testten sonra öldü.