POSIX อนุญาตให้ mutexes วนซ้ำ นั่นหมายความว่าเธรดเดียวกันสามารถล็อค mutex เดียวกันสองครั้งและจะไม่หยุดชะงัก แน่นอนว่ามันต้องปลดล็อคสองครั้งมิฉะนั้นจะไม่มีเธรดอื่นที่สามารถรับ mutex ได้ ไม่ได้ทุกระบบสนับสนุน pthreads ยังสนับสนุน mutexes recursive แต่ถ้าพวกเขาต้องการที่จะPOSIX สอดคล้องพวกเขาจะต้อง
API อื่น ๆ (API ระดับสูงกว่า) มักจะเสนอ mutexes ซึ่งมักเรียกว่าล็อค ระบบ / ภาษาบางระบบ (เช่น Cocoa Objective-C) เสนอทั้ง mutex แบบเรียกซ้ำและไม่เรียกซ้ำ บางภาษาเสนอเพียงหนึ่งภาษาเท่านั้น เช่นใน Java mutexes จะเรียกซ้ำ (เธรดเดียวกันอาจสองครั้ง "ซิงโครไนซ์" บนวัตถุเดียวกัน) ขึ้นอยู่กับฟังก์ชันเธรดอื่น ๆ ที่พวกเขาเสนอการไม่มี mutexes แบบเรียกซ้ำอาจไม่มีปัญหาเนื่องจากพวกเขาสามารถเขียนได้อย่างง่ายดายด้วยตัวคุณเอง
สิ่งที่ฉันไม่เข้าใจจริง ๆ : สิ่งที่กลายพันธุ์ที่ไม่เกิดขึ้นซ้ำนั้นดีสำหรับ เหตุใดฉันจึงต้องการให้เธรดการล็อคตายตัวหากล็อค mutex เดียวกันสองครั้ง แม้แต่ภาษาระดับสูงที่สามารถหลีกเลี่ยงปัญหานั้นได้ (เช่นการทดสอบว่าสิ่งนี้จะทำให้เกิดการหยุดชะงักและการยกเว้นหากทำได้) มักจะไม่ทำ พวกเขาจะปล่อยให้เธรดหยุดชะงักแทน
นี่เป็นเพียงกรณีที่ฉันตั้งใจล็อคสองครั้งเท่านั้นและปลดล็อคเพียงครั้งเดียวและในกรณีของ mutex แบบเรียกซ้ำมันจะยากกว่าในการค้นหาปัญหาดังนั้นแทนที่จะให้ฉันหยุดชะงักทันทีเพื่อดูว่าตัวล็อคไม่ถูกต้องหรือไม่ แต่ฉันไม่สามารถทำเช่นเดียวกันกับที่มีการส่งคืนการล็อกเมื่อปลดล็อกและในสถานการณ์ที่ฉันแน่ใจว่าฉันปล่อยล็อคล่าสุดและตัวนับไม่เป็นศูนย์ฉันสามารถโยนข้อยกเว้นหรือบันทึกปัญหาได้หรือไม่ หรือมีกรณีการใช้งาน mutex ที่ไม่ใช่แบบเรียกซ้ำที่มีประโยชน์มากกว่าที่ฉันมองไม่เห็นหรือไม่? หรืออาจเป็นเพียงแค่ประสิทธิภาพเนื่องจาก mutex ที่ไม่ใช่แบบเรียกซ้ำสามารถเร็วกว่าแบบเรียกซ้ำได้เล็กน้อย อย่างไรก็ตามฉันทดสอบสิ่งนี้และความแตกต่างก็ไม่ใหญ่มาก