ค้นหา Deadlock
เมื่อโปรแกรมมิงแบบมัลติเธรดต้องใช้ความระมัดระวังเพื่อหลีกเลี่ยงการล็อคเธรดต่าง ๆ เมื่อเข้าถึงทรัพยากรที่ใช้ร่วมกัน การหยุดชะงักเกิดขึ้นเมื่อเธรดพยายามเข้าถึงทรัพยากรที่ถูกล็อคในเธรดอื่นในเวลาเดียวกันกับที่เธรดอื่นกำลังพยายามเข้าถึงทรัพยากรที่ถูกล็อคโดยเธรดแรก นี่เป็นกรณีที่ง่าย แต่อาจมีความซับซ้อนมากขึ้นด้วยโซ่ทรัพยากรที่ยาวขึ้น
ความท้าทาย
คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่สามารถตรวจจับสถานการณ์การหยุดชะงักที่เป็นไปได้ในรายการทรัพยากรที่เข้าถึงได้โดยแต่ละเธรด นี่คือ code-golf ดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
ทุกเธรดเริ่มต้นในเวลาเดียวกัน แต่หลังจากนั้นเธรดสามารถทำงานร่วมกันได้ หากมี 2 หัวข้อ 4 การกระทำของแต่ละคนก็อาจจะทำงานเป็น (ที่แต่ละหมายเลขเป็นการกระทำที่เกิดจากด้ายกับว่า ID) 1,1,1,1,2,2,2,2
, 2,2,2,2,1,1,1,1
, 1,2,1,2,1,2,1,2
, 1,1,2,2,2,2,1,1
หรือใด ๆ รวมกันเป็นไปได้อื่น ๆ
อินพุต
คุณจะได้รับรายการของสตริงผ่านทาง STDIN พารามิเตอร์ฟังก์ชันหรือทางเลือกที่ใกล้เคียงที่สุด +a
-b
แต่ละสายจะอยู่ในรูปแบบ ทุกสตริงนี้แสดงถึงการล็อค ( +
) / ปลดล็อค ( -
) ของทรัพยากรโดยเธรด ระหว่างทุกเธรดจะเป็น---
ตัวคั่น มีการรับประกันว่าเธรดจะไม่พยายามล็อกทรัพยากรที่ถูกล็อกไปแล้วและเธรดทั้งหมดจะปลดล็อกรีซอร์สทั้งหมดที่ล็อกไว้อย่างชัดเจนก่อนออก ต่อไปนี้เป็นตัวอย่างที่แสดงให้เห็น:
+a # Lock resource a
+b # Lock resource b
-a # Unlock resource a
-b # Unlock resource b
--- # Thread separator
+b # Lock resource b
-b # Unlock resource b
เอาท์พุต
เอาต์พุตจะเป็นเท็จถ้าอินพุตไม่มีความเป็นไปได้ของการหยุดชะงักและความจริงถ้ามันมีสถานการณ์การหยุดชะงักที่เป็นไปได้ ตัวอย่างเช่น:
true
false
1
0
เป็นผลลัพธ์ที่ถูกต้องทั้งหมด แต่สิ่งใดก็ตามที่กำหนดไว้อย่างชัดเจนว่าเป็นความจริง / เท็จจะได้รับการยอมรับ
ตัวอย่าง
+a
-a
---
+a
-a
เอาท์พุท: false
+a
+b
-b
-a
---
+b
+a
-a
-b
เอาท์พุต true
การหยุดชะงักเมื่อพยายามรับb,a
เธรดตามลำดับ1,2
+a
+b
-a
-b
---
+a
+b
-b
-a
เอาท์พุต false
+a
+b
-b
-a
---
+b
+c
-c
-b
---
+c
+a
-a
-c
เอาท์พุท: true
การหยุดชะงักในเธรด 1,2,3 เมื่อพยายามรับb,c,a
ตามลำดับ
เอาท์พุต false
เอาท์พุต true
การหยุดชะงักในเธรด 1,2,3 เมื่อพยายามรับb,d,a
ตามลำดับ
แน่นอนว่าสิ่งนี้อาจมีความซับซ้อนมากขึ้นโดยมีเธรดมากขึ้นทรัพยากรเพิ่มเติมสำหรับแต่ละรายการและอื่น ๆ แต่ฉันเชื่อว่าการทดสอบเหล่านี้ครอบคลุมพื้นฐาน
โบนัส
เนื่องจากเป็นเรื่องที่น่าเศร้ามากเมื่อคุณพบสถานการณ์การหยุดชะงักเมื่อเขียนโปรแกรมจึงมีโบนัส -8 ไบต์เพื่อตอบสนองการแสดงผล:(
และ:)
เป็นความจริง / เท็จตามลำดับ
d
จนกระทั่งในภายหลัง
:)
ไม่ควรเป็นเท็จและ:(
จริงหรือ?