จะเกิดอะไรขึ้นหากการขัดจังหวะเกิดขึ้นหลังจากได้รับการล็อค mutex

ฉันมีโปรแกรม C/C++ แบบมัลติเธรดที่ให้บริการอ่านและเขียนคำขอบ่อยมาก เพื่อจุดประสงค์ในการซิงโครไนซ์ ฉันได้ใช้ mutex สำหรับการล็อคและปลดล็อค เธรดการอ่านและเขียนทั้งหมดได้รับการล็อคก่อนดำเนินการ จะเกิดอะไรขึ้นหากเธรดหนึ่งได้รับการล็อค และก่อนที่จะสามารถปลดล็อคได้ การขัดจังหวะจะเกิดขึ้น ? เธรดจะดำเนินการต่อไปหรือฉันจะต้องจัดการด้วยตนเอง


person user3296247    schedule 06.03.2014    source แหล่งที่มา
comment
ไม่มีใครจะปลดล็อค mutex ที่ล็อคไว้ได้อย่างน่าอัศจรรย์ การตั้งโปรแกรมด้วยการล็อคมีข้อเสียคือเวลาในการรออาจมีขนาดใหญ่ตามอำเภอใจและอาจเกิดการหยุดชะงักได้ (ที่กล่าวว่าตัวจัดการการขัดจังหวะมักจะส่งคืนการดำเนินการไปยังจุดที่พวกเขาค้างไว้ในที่สุด)   -  person Kerrek SB    schedule 06.03.2014


คำตอบ (3)


การล็อคฝั่งผู้ใช้ รวมถึง Mutexes จะไม่ปิดกั้นการขัดจังหวะ นี่เป็นสิ่งสำคัญ เนื่องจากบ่อยครั้งที่ Mutex อาจถูกใช้เพื่อป้องกันการอ่านจากไฟล์บนดิสก์ หรือป้องกันการรับแพ็กเก็ตจากเครือข่าย และเช่นนี้ โดยที่ผลลัพธ์จะขึ้นอยู่กับการขัดจังหวะ

โดยพื้นฐานแล้ว "ไม่มีอะไร" เกิดขึ้นหากมีการขัดจังหวะ ระบบปฏิบัติการจะจัดการการขัดจังหวะเช่นเดียวกับครั้งอื่นๆ คุณไม่จำเป็นต้องทำอะไรที่โปรแกรมของคุณในกรณีนี้ เพียงแต่จะใช้เวลานานกว่าสองสามไมโครวินาทีหรือมิลลิวินาทีเพื่อทำสิ่งที่คุณตั้งโปรแกรมไว้หากสิ่งนี้เกิดขึ้น

การล็อกฝั่งเคอร์เนลบางตัว เช่น SpinLocks จะบล็อกการขัดจังหวะ (บนแกนประมวลผลนั้น) เพื่อให้แน่ใจว่ากระบวนการ/เธรดอื่นๆ ไม่ได้รับการกำหนดเวลาในระหว่างกระบวนการนี้ นอกจากนี้ยังมีข้อจำกัดเกี่ยวกับฟังก์ชันที่เคอร์เนลสามารถใช้ได้ภายใต้สถานการณ์เหล่านี้ ตัวอย่างเช่น จะไม่สามารถเรียกใช้ฟังก์ชันการบล็อกได้ (เช่น โหมดสลีป การรอเหตุการณ์ หรือการอ่านไฟล์หรือการเขียนไฟล์) ในระหว่างนี้ ในครั้งนี้ เพราะนั่นอาจทำให้เคอร์เนลล็อคได้

person Mats Petersson    schedule 06.03.2014

ในที่สุดเธรดจะกลับมาดำเนินการอีกครั้ง ซึ่งอาจเกิดขึ้นทันทีหลังจากเคอร์เนลให้บริการการขัดจังหวะ หรือตัวกำหนดเวลาเคอร์เนลอาจตัดสินใจส่งเธรดอื่นที่พร้อมที่จะรัน หากเธรดที่ถูกขัดจังหวะได้รับการล็อคที่มีการโต้แย้งอย่างมาก เธรดอื่นที่พยายามรับการล็อคนั้นจะบล็อก (หรือหมุน หรือหมุนแล้วบล็อก ขึ้นอยู่กับการนำ mutex ไปใช้งาน) จนกว่าเธรดที่ถูกขัดจังหวะจะถูกส่งอีกครั้ง เสร็จสิ้น ส่วนสำคัญได้รับการปกป้องด้วยการล็อคและปลดล็อค

ในระบบที่ต้องการประสิทธิภาพการทำงานแบบใกล้กับเรียลไทม์ การปรับแต่งอย่างระมัดระวังจะกระทำเพื่อกำหนดเธรดที่สำคัญให้กับคอร์ของตัวเอง (ความสัมพันธ์ของ CPU) และเพื่อแมปการขัดจังหวะกับคอร์อื่นๆ นอกจากนี้ ยังให้ความสำคัญกับการใช้การล็อคอย่างระมัดระวัง บางครั้งใช้อัลกอริธึมที่ไม่มีการล็อค

person amdn    schedule 06.03.2014

ความจริงที่ว่าเธรดมีการล็อคไม่ได้รับอิทธิพลจากสัญญาณ หากเธรดมีการล็อคและรับสัญญาณ จะไม่มีอะไรพิเศษเกิดขึ้น ในความเป็นจริง สัญญาณและเธรดไม่เข้ากันดีเนื่องจากสัญญาณได้รับการออกแบบโดยคำนึงถึงกระบวนการเป็นหลัก นั่นเป็นเพราะคุณไม่สามารถรู้ได้ว่าเธรดใดจะรับสัญญาณได้ วิธีที่ถูกต้องในการจัดการกับสิ่งนั้นคือการมีเธรดเฉพาะเพื่อจัดการสัญญาณ เช่น บล็อกสัญญาณทั้งหมดในทุกเธรด เหลือเพียงเธรดเดียว ซึ่งมีหน้าที่จัดการสัญญาณเท่านั้น นั่นเป็นวิธีที่ถูกต้องในการจัดการกับสัญญาณในซอฟต์แวร์ที่มีเธรด

person neuro    schedule 06.03.2014