Ruby, 39 ตัวอักษร
T=Thread;t=T.current;T.new{t.join}.join
ความคิดที่จะใช้ข้ามเข้าร่วมขโมยลงคอจากโยฮันเน Kuhn คำตอบของ
เราสามารถโกนอักขระสี่ตัว (เพิ่มเป็น35 ) ถ้าเราปรับรหัสให้เหมาะกับสภาพแวดล้อมที่เฉพาะเจาะจง IRB ของ JRuby นั้นเป็นแบบเธรดเดี่ยว:
T=Thread;T.new{T.list[0].join}.join
นี่คือโซลูชันก่อนหน้าของฉัน:
การทำให้เธรดติดอยู่บน mutex นั้นง่าย:
m=Mutex.new;2.times{Thread.new{m.lock}}
แต่นี่ไม่ใช่การหยุดชะงักที่เหมาะสมเนื่องจากเธรดที่สองไม่สามารถรอเธรดแรกได้ในทางเทคนิค "hold and wait" เป็นเงื่อนไขที่จำเป็นสำหรับการหยุดชะงักตาม Wikipedia เธรดแรกไม่รอและเธรดที่สองไม่เก็บสิ่งใดไว้
ทับทิม, 97 95 ตัวอักษร
m,n=Mutex.new,Mutex.new
2.times{o,p=(m,n=n,m)
Thread.new{loop{o.synchronize{p.synchronize{}}}}}
นี่คือการหยุดชะงักแบบคลาสสิก สองเธรดแย่งชิงสองทรัพยากรลองใหม่หากประสบความสำเร็จ โดยปกติแล้วพวกเขาจะติดอยู่ภายในเครื่องของฉันภายในไม่กี่วินาที
แต่ถ้ามีเธรดจำนวนมากเหลือเฟือ (ไม่มีหัวข้อใดที่กิน CPU ไม่สิ้นสุดและบางส่วนหยุดชะงัก) ก็โอเค
ทับทิม, 87 85 ตัวอักษร
m,n=Mutex.new,Mutex.new
loop{o,p=(m,n=n,m)
Thread.new{o.synchronize{p.synchronize{}}}}
ตามการทดสอบของฉันมันล้มเหลวหลังจากการนับจำนวนเธรดถึงประมาณ 4700 หวังว่าจะไม่ล้มเหลวจนกว่าแต่ละเธรดจะมีโอกาสเรียกใช้ (เช่น deadlocking หรือจบและพื้นที่ว่างสำหรับใหม่) จากการทดสอบของฉันจำนวนเธรดไม่ลดลงหลังจากความล้มเหลวเกิดขึ้นหมายความว่ามีการหยุดชะงักในระหว่างการทดสอบ นอกจากนี้ IRB ก็เสียชีวิตหลังการทดสอบ