Рубі, 39 символів
T=Thread;t=T.current;T.new{t.join}.join
Ідея використовувати перехресне з'єднання безсоромно викрадена з відповіді Яванна Куна на Java .
Ми можемо стригти чотири символи (до 35 ), якщо налаштувати код на певне середовище. IRB консолі JRuby однопоточний:
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. Сподіваємось, він не вийде з ладу, поки кожен потік не мав шанс запуститись (таким чином, або замикаючи або закінчуючи, і звільняючи місце для нового). Згідно з моїм тестом, кількість ниток не зменшується після того, як стався збій, це означає, що під час тесту стався тупик. Також IRB помер після тесту.