Ruby, 39 znaków
T=Thread;t=T.current;T.new{t.join}.join
Pomysł użycia połączenia krzyżowego bezwstydnie skradzionego z odpowiedzi Java Johana Kuhna .
Możemy ogolić cztery znaki (do 35 ), jeśli dostroimy kod do określonego środowiska. Konsola JRuby IRB jest jednowątkowa:
T=Thread;T.new{T.list[0].join}.join
To jest moje poprzednie rozwiązanie:
utknięcie nici na muteksie jest łatwe:
m=Mutex.new;2.times{Thread.new{m.lock}}
ale to nie jest właściwy impas, ponieważ drugi wątek technicznie nie czeka na pierwszy wątek. Według Wikipedii „czekaj i czekaj” jest niezbędnym warunkiem impasu. Pierwszy wątek nie czeka, a drugi wątek nic nie zawiera.
Rubin, 97 95 znaków
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
to klasyczny impas. Dwa wątki rywalizują o dwa zasoby, ponawiając próbę, jeśli im się powiedzie. Zwykle utkną w ciągu sekundy na moim komputerze.
Ale jeśli posiadanie nieskończenie wielu wątków (z których żaden nie zużywa procesora nieskończenie, a niektóre z nich są zakleszczone) jest OK,
Rubin, 87 85 znaków
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
Według mojego testu nie powiedzie się, gdy liczba wątków osiągnie około 4700. Mam nadzieję, że nie zawiedzie, dopóki każdy wątek nie będzie miał szansy na uruchomienie (w ten sposób albo zakleszczenie, albo zakończenie i zwolnienie miejsca na nowy). Według mojego testu liczba wątków nie spada po wystąpieniu awarii, co oznacza, że podczas testu wystąpił zakleszczenie. Ponadto IRB zmarł po teście.