Ruby, 39 caractères
T=Thread;t=T.current;T.new{t.join}.join
L'idée d'utiliser une jointure croisée dérobée sans vergogne à la réponse Java de Johannes Kuhn .
Nous pouvons raser quatre caractères (jusqu'à 35 ) si nous réglons le code sur un environnement spécifique. La console IRB de JRuby est monothread:
T=Thread;T.new{T.list[0].join}.join
Voici ma solution précédente:
obtenir un fil coincé sur un mutex est facile:
m=Mutex.new;2.times{Thread.new{m.lock}}
mais ce n'est pas une impasse appropriée, car le deuxième thread n'attend techniquement pas le premier thread. "attendre et attendre" est une condition nécessaire pour une impasse selon Wikipedia. Le premier thread n'attend pas et le second thread ne contient rien.
Rubis, 97 95 caractères
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
c'est une impasse classique. Deux threads rivalisent pour deux ressources, réessayant s'ils réussissent. Normalement, ils se coincent en une seconde sur ma machine.
Mais, si avoir un nombre infini de threads (dont aucun ne consomme infiniment CPU et dont certains bloquent) est OK,
Rubis, 87 85 caractères
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
Selon mon test, il échoue après que le nombre de threads atteigne environ 4700. J'espère qu'il n'échouera pas jusqu'à ce que chaque thread ait une chance de s'exécuter (donc soit un blocage, soit une finition et une libération d'espace pour un nouveau). Selon mon test, le nombre de threads ne baisse pas après l'échec, ce qui signifie qu'un blocage s'est produit pendant le test. De plus, l'IRB est décédée après le test.