ขึ้นอยู่กับวิธีการนำล็อคไปใช้ หากคุณทำเช่นเดียวกับในบทความ Wikipedia เช่นการปกป้องส่วนสำคัญด้วยบูลีนเดียวต่อกระบวนการ¹แสดงว่าคุณกำลังมีปัญหา หากกระบวนการหนึ่งตายกระบวนการจะไม่รีเซ็ตสถานะของมันดังนั้นกระบวนการอื่นจึงวนซ้ำตลอดไป
ในทางปฏิบัติคุณสามารถปกป้องรหัสของคุณจากการตายหลายวิธี ตัวอย่างเช่นใช้การนำ Java-style นี้ไปใช้:
flag[1] = true;
turn = 1;
while ( flag[0] == true && turn == 1 ) { Thread.yield(); }
try {
// critical section
}
finally {
flag[1] = false;
}
สิ่งนี้จะทำให้แน่ใจว่าการตั้งค่าสถานะถูกรีเซ็ตสิ่งที่เกิดขึ้นในส่วนที่สำคัญตราบใดที่ระบบกำลังจัดการข้อผิดพลาด ใน Java นั้นเป็นจริงแม้แต่กับ stack และ heap overflows ดังนั้นหากกระบวนการหายไปอย่างแท้จริง ( kill
²ความล้มเหลวของตัวประมวลผลการตัดการเชื่อมต่อเครือข่าย ... ) คุณปลอดภัย โปรดทราบว่าซอฟต์แวร์ที่ไม่สำคัญส่วนใหญ่จะล้มเหลวในกรณีเหล่านี้ - จะจัดการข้อผิดพลาดได้อย่างไรว่าไม่ทำงาน - เพื่อที่จะต้องได้รับการยอมรับในหลายกรณี คุณสามารถจัดการกับความไม่สอดคล้องเมื่อรีสตาร์ทหากจำเป็น
หากคุณใช้การล็อคระดับภาษาที่เหมาะสมระบบรันไทม์อาจจัดการกับเจ้าของล็อคที่หายไปเช่นปลดล็อคกับเจ้าของที่ไม่ทำงาน คุณสามารถจำลองสิ่งนี้ด้วยตัวเองโดยให้แต่ละสวิทช์ของคนตายสามารถอ่านหรือตรวจสอบโดยตรงว่ากระบวนการล็อคตัวเองยังมีชีวิตอยู่หรือไม่ (หากระบบรองรับ)
- ที่ไม่ได้ขนาดดีอยู่แล้ว
- ใน Java ฉันคิดว่า
finalize
ควรจะดำเนินการแม้ในkill
แต่ไม่ได้รับประกันโดย spec kill -9
อาจเป็นประโยคประหารชีวิตสำหรับวิธีการแก้ปัญหาใด ๆ ที่ต้องใช้กระบวนการตายเพื่อทำอะไรบางอย่าง