Ruby, 39 Zeichen
T=Thread;t=T.current;T.new{t.join}.join
Die Idee, einen Cross-Join zu verwenden, wurde schamlos aus Johannes Kuhns Java-Antwort gestohlen .
Wir können vier Zeichen (bis 35 ) rasieren, wenn wir den Code auf eine bestimmte Umgebung abstimmen. JRubys Konsolen-IRB ist Single-Threaded:
T=Thread;T.new{T.list[0].join}.join
Dies ist meine vorherige Lösung:
Es ist einfach, einen Thread auf einen Mutex zu kleben:
m=Mutex.new;2.times{Thread.new{m.lock}}
Dies ist jedoch kein richtiger Deadlock, da der zweite Thread technisch nicht auf den ersten Thread wartet. "hold and wait" ist laut Wikipedia eine notwendige Voraussetzung für einen Deadlock. Der erste Thread wartet nicht und der zweite Thread enthält nichts.
Rubin, 97 95 Zeichen
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
Dies ist ein klassischer Deadlock. Zwei Threads konkurrieren um zwei Ressourcen und versuchen es erneut, wenn sie erfolgreich sind. Normalerweise bleiben sie innerhalb einer Sekunde auf meiner Maschine stecken.
Wenn es jedoch in Ordnung ist, unendlich viele Threads zu haben (von denen keiner unendlich viel CPU verbraucht und von denen einige einen Deadlock aufweisen),
Rubin, 87 85 Zeichen
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
Meinem Test zufolge schlägt es fehl, nachdem die Thread-Anzahl ungefähr 4700 erreicht hat. Hoffentlich schlägt es nicht fehl, bis jeder Thread eine Chance zum Ausführen hatte (also entweder Deadlocking oder Beenden und Freigeben von Speicherplatz für einen neuen). Laut meinem Test sinkt die Thread-Anzahl nach dem Auftreten des Fehlers nicht, was bedeutet, dass während des Tests ein Deadlock aufgetreten ist. Auch IRB starb nach dem Test.