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()
यदि झूठे नकारात्मक को वापस करने की अनुमति है और अपरिभाषित व्यवहार किया जाता है यदि वर्तमान थ्रेड ने म्यूटेक्स को लॉक किया है। इसके साइड-इफेक्ट भी होते हैं। मूल के शीर्ष पर owns_lock()
निर्माण की आवश्यकता है ।unique_lock
std::mutex
जाहिर है कि मैं अपना रोल कर सकता हूं, लेकिन मैं वर्तमान इंटरफेस के लिए प्रेरणाओं को समझूंगा।
एक म्यूटेक्स (जैसे std::mutex::is_locked()
) की स्थिति की जांच करने की क्षमता मेरे लिए एक गूढ़ अनुरोध की तरह नहीं लगती है, इसलिए मुझे संदेह है कि मानक समिति ने जानबूझकर इस सुविधा को छोड़ दिया है क्योंकि यह एक निरीक्षण है।
क्यूं कर?
संपादित करें: ठीक है, इसलिए शायद यह प्रयोग मामला उतना सामान्य नहीं है जितना मैंने उम्मीद की थी, इसलिए मैं अपने विशेष परिदृश्य का वर्णन करूँगा। मेरे पास एक मशीन लर्निंग एल्गोरिदम है जो कई थ्रेड्स पर वितरित किया गया है। प्रत्येक थ्रेड एसिंक्रोनस रूप से काम करता है, और एक मास्टर पूल में लौटने के बाद एक अनुकूलन समस्या पूरी हो जाती है।
यह तब एक मास्टर म्यूटेक्स को लॉक करता है। थ्रेड को तब एक नया माता-पिता चुनना चाहिए, जिससे वंश उत्पन्न हो, लेकिन केवल उन माता-पिता से चुन सकते हैं, जिनके पास वर्तमान में ऐसी संतान नहीं है, जो अन्य धागों द्वारा अनुकूलित की जा रही हैं। इसलिए मुझे उन माता-पिता को खोजने के लिए एक खोज करने की आवश्यकता है जो वर्तमान में किसी अन्य धागे से बंद नहीं हैं। खोज के दौरान म्यूटेक्स की स्थिति का कोई खतरा नहीं है, क्योंकि मास्टर थ्रेड म्यूटेक्स लॉक है। जाहिर है कि अन्य समाधान हैं (मैं वर्तमान में बूलियन ध्वज का उपयोग कर रहा हूं) लेकिन मुझे लगा कि म्यूटेक्स इस समस्या का तार्किक समाधान प्रदान करता है, क्योंकि यह अंतर-थ्रेड सिंक्रोनाइज़ेशन के उद्देश्य से मौजूद है।
is_locked
?