Rubino, 39 caratteri
T=Thread;t=T.current;T.new{t.join}.join
L'idea di utilizzare un cross-join sottratto senza vergogna alla risposta Java di Johannes Kuhn .
Possiamo radere quattro caratteri (arrivando a 35 ) se sintonizziamo il codice su un ambiente specifico. La console IRB di JRuby è a thread singolo:
T=Thread;T.new{T.list[0].join}.join
Questa è la mia soluzione precedente:
ottenere un thread bloccato su un mutex è facile:
m=Mutex.new;2.times{Thread.new{m.lock}}
ma questo non è un deadlock corretto, poiché il secondo thread non sta tecnicamente aspettando il primo thread. "hold and wait" è una condizione necessaria per un deadlock secondo Wikipedia. Il primo thread non aspetta e il secondo thread non contiene nulla.
Rubino, 97 95 caratteri
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
questo è un classico deadlock. Due thread competono per due risorse, riprovando se hanno successo. Normalmente si bloccano in un secondo sulla mia macchina.
Ma, se avere infiniti thread (nessuno dei quali consuma la CPU all'infinito e alcuni dei quali deadlock) è OK,
Rubino, 87 85 caratteri
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
Secondo il mio test, fallisce quando il conteggio dei thread raggiunge circa 4700. Speriamo che non fallisca fino a quando ogni thread non ha avuto la possibilità di essere eseguito (quindi deadlock o finitura e liberando spazio per uno nuovo). Secondo il mio test, il conteggio dei thread non diminuisce dopo che si è verificato l'errore, il che significa che si è verificato un deadlock durante il test. Inoltre, l'IRB è morto dopo il test.