Ruby, 39 karakter
T=Thread;t=T.current;T.new{t.join}.join
Gagasan untuk menggunakan cross-join tanpa malu-malu dicuri dari jawaban Java Johannes Kuhn .
Kita dapat mengurangi empat karakter (mencapai 35 ) jika kita menyelaraskan kode ke lingkungan tertentu. Konsol JRuby, IRB, adalah single-threaded:
T=Thread;T.new{T.list[0].join}.join
Ini solusi saya sebelumnya:
mendapatkan utas macet di mutex itu mudah:
m=Mutex.new;2.times{Thread.new{m.lock}}
tapi ini bukan jalan buntu, karena utas kedua secara teknis tidak menunggu utas pertama. "tahan dan tunggu" adalah kondisi yang diperlukan untuk kebuntuan menurut Wikipedia. Utas pertama tidak menunggu, dan utas kedua tidak menahan apa pun.
Rubi, 97 95 karakter
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
ini adalah kebuntuan klasik. Dua utas bersaing untuk dua sumber daya, mencoba lagi jika mereka berhasil. Biasanya mereka macet dalam sedetik di mesin saya.
Tetapi, jika memiliki banyak utas (tidak ada yang mengkonsumsi CPU secara tak terbatas dan beberapa di antaranya kebuntuan) tidak apa-apa,
Rubi, 87 85 karakter
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
Menurut pengujian saya, itu gagal setelah jumlah utas mencapai sekitar 4700. Semoga tidak gagal sampai setiap utas memiliki kesempatan untuk berjalan (sehingga deadlock atau finishing dan membebaskan ruang untuk yang baru). Menurut pengujian saya, jumlah utas tidak turun setelah kegagalan terjadi, artinya kebuntuan memang terjadi selama pengujian. Juga, IRB meninggal setelah tes.