Ruby, 39 ký tự
T=Thread;t=T.current;T.new{t.join}.join
Ý tưởng sử dụng một sự tham gia chéo đáng xấu hổ bị đánh cắp từ câu trả lời Java của Johannes Kuhn .
Chúng tôi có thể tắt bốn ký tự (đến 35 ) nếu chúng tôi điều chỉnh mã theo một môi trường cụ thể. Bảng điều khiển IRB của JRuby là một luồng:
T=Thread;T.new{T.list[0].join}.join
Đây là giải pháp trước đây của tôi:
nhận được một chủ đề bị mắc kẹt trên một mutex là dễ dàng:
m=Mutex.new;2.times{Thread.new{m.lock}}
nhưng đây không phải là một bế tắc thích hợp, bởi vì luồng thứ hai về mặt kỹ thuật không chờ đợi luồng đầu tiên. "Giữ và chờ" là một điều kiện cần thiết cho sự bế tắc theo Wikipedia. Chuỗi đầu tiên không chờ đợi và luồng thứ hai không giữ bất cứ điều gì.
Hồng ngọc 97 95 ký tự
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
đây là một bế tắc cổ điển. Hai luồng cạnh tranh cho hai tài nguyên, thử lại nếu họ thành công. Thông thường họ bị kẹt trong vòng một giây trên máy của tôi.
Nhưng, nếu có vô số luồng (không có luồng nào tiêu thụ CPU vô hạn và một số trong số đó là bế tắc) thì OK,
Hồng ngọc 87 85 ký tự
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
Theo thử nghiệm của tôi, nó thất bại sau khi số luồng đạt khoảng 4700. Hy vọng rằng nó không thất bại cho đến khi mỗi luồng có cơ hội chạy (do đó là bế tắc hoặc hoàn thiện và giải phóng không gian cho một cái mới). Theo thử nghiệm của tôi, số lượng luồng không giảm sau khi xảy ra lỗi, có nghĩa là sự bế tắc đã xảy ra trong quá trình thử nghiệm. Ngoài ra, IRB đã chết sau khi thử nghiệm.