C ++ 14 ดูเหมือนจะไม่ได้ใช้กลไกสำหรับตรวจสอบว่ามีการstd::mutex
ล็อกอยู่หรือไม่ ดูคำถาม SO นี้:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
มีหลายวิธีเช่นนี้โดยใช้;
std::mutex::try_lock()
std::unique_lock::owns_lock()
แต่สิ่งเหล่านี้ไม่ได้เป็นโซลูชั่นที่น่าพึงพอใจโดยเฉพาะ
try_lock()
ได้รับอนุญาตให้ส่งคืนค่าลบที่เป็นเท็จและมีพฤติกรรมที่ไม่ได้กำหนดหากเธรดปัจจุบันล็อค mutex นอกจากนี้ยังมีผลข้างเคียง owns_lock()
ต้องมีการก่อสร้างที่อยู่ด้านบนของเดิมunique_lock
std::mutex
เห็นได้ชัดว่าฉันสามารถม้วนตัวเอง แต่ฉันค่อนข้างเข้าใจแรงจูงใจสำหรับอินเทอร์เฟซปัจจุบัน
ความสามารถในการตรวจสอบสถานะของ mutex (เช่นstd::mutex::is_locked()
) ดูเหมือนจะไม่เป็นการร้องขอที่ลึกลับสำหรับฉันดังนั้นฉันจึงสงสัยว่าคณะกรรมการมาตรฐานได้ละเว้นคุณลักษณะนี้โดยไม่ได้ตั้งใจ
ทำไม?
แก้ไข:ตกลงดังนั้นกรณีการใช้งานนี้อาจไม่เหมือนที่ฉันคาดไว้ดังนั้นฉันจะอธิบายสถานการณ์ของฉันโดยเฉพาะ ฉันมีอัลกอริทึมการเรียนรู้ของเครื่องซึ่งกระจายอยู่ในหลายเธรด แต่ละเธรดทำงานแบบอะซิงโครนัสและกลับไปยังพูลต้นแบบเมื่อปัญหาการปรับให้เหมาะสมเสร็จสมบูรณ์
จากนั้นล็อคมาสเตอร์ mutex จากนั้นเธรดต้องเลือกพาเรนต์ใหม่ที่จะทำการกลายพันธุ์ของลูกหลาน แต่อาจเลือกจากพาเรนต์ที่ยังไม่มีลูกในขณะนี้ซึ่งถูกปรับให้เหมาะสมโดยเธรดอื่น ฉันจึงต้องทำการค้นหาเพื่อค้นหาผู้ปกครองที่ไม่ได้ล็อคโดยเธรดอื่นในขณะนี้ ไม่มีความเสี่ยงของสถานะของการเปลี่ยนแปลง mutex ระหว่างการค้นหาเนื่องจากมาสเตอร์เธรด mutex ถูกล็อก เห็นได้ชัดว่ามีวิธีแก้ปัญหาอื่น ๆ (ขณะนี้ฉันใช้แฟล็กบูลีน) แต่ฉันคิดว่า mutex เสนอวิธีแก้ปัญหาแบบลอจิคัลกับปัญหานี้เนื่องจากมีอยู่เพื่อจุดประสงค์ในการซิงโครไนซ์ระหว่างเธรด
is_locked
บ้าง