boost::shared_mutex
कक्षा (जो अपग्रेड लॉक करने योग्य अवधारणा को लागू करता है) में, एक थ्रेड को साझा और अपग्रेड करने योग्य (या अद्वितीय) लॉक दोनों हासिल करने का प्रयास नहीं करना चाहिए। किसी भी समय, अपग्रेड लॉकबल में एन साझा लॉक हो सकते हैं (lock_shared
के माध्यम से), और 1 अपग्रेड करने योग्य लॉक (lock_upgrade
के माध्यम से)। अपग्रेड करने योग्य लॉक अनुरोध कर सकता है कि यह एक अनूठा लॉक बन जाए, जो तब तक अवरुद्ध हो जाता है जब तक कि यह अनन्य धारक बन न जाए, जिसके लिए सभी साझा ताले जारी किए जाने की आवश्यकता होती है। किसी साझा लॉक से अनन्य लॉक में परिवर्तित करना असंभव है, या किसी साझा लॉक को पहले लॉक को रिलीज़ किए बिना अपग्रेड करने योग्य लॉक में परिवर्तित करना असंभव है।
नोट, अपग्रेड करने योग्य लॉक अनन्य नहीं है (अन्य साझा ताले आयोजित किए जा सकते हैं) कि इसकी ताकत बढ़ाने के लिए विशेष विशेषाधिकार हैं। दुर्भाग्यवश, एक ही समय में कई अपग्रेड करने योग्य थ्रेड की अनुमति नहीं है।
अपने मामले में, वही धागा lock_shared
और lock_upgrade
का उपयोग करने का प्रयास कर रहा है, जो डेडलॉक होगा। आप इसे नीचे लिख सकते हैं, और यह डेडलॉक नहीं होगा, लेकिन यह अभी भी सभी पाठकों के लिए विवाद का एक बिंदु है, क्योंकि केवल 1 ही एक समय में अपग्रेड लॉक रखेगा। इस मामले में, आपके अन्य कार्यों के आधार पर, shared_mutex की जटिलता आवश्यक नहीं हो सकती है। हालांकि, यदि अन्य फ़ंक्शंस अभी भी साझा लॉक प्राप्त कर रहे हैं, तो नीचे की अपेक्षा के अनुसार नीचे प्रदर्शन किया जाएगा।
//Multi threaded reader and writer
{
// Only 1 thread can pass this. Other shared locks are also valid
UpgradeLock read(sharedMutex);
for (int ii = 0; ii < vec.size(); ++ii) {
Element e = vec[ii];
if (e.needsUpdating()) {
// Blocks here until all shareds are released
WriteLock write(upgrade)
//Do stuff
}
}
}
स्रोत
2011-09-11 14:17:46
दुर्भाग्यवश मुझे एक ही समय में लूप में प्रवेश करने में सक्षम होने के लिए एकाधिक पाठकों की आवश्यकता है, इसलिए मैं अपग्रेड लॉक का उपयोग नहीं कर सकता। समझाने के लिए धन्यवाद। –