2011-09-11 6 views
7

क्या कोई कृपया boost :: upgrade_lock के लिए सही उपयोग की व्याख्या कर सकता है। एक गतिरोधबूस्ट को अपग्रेड करना :: अनन्य लॉक में साझा_लॉक

//Global 
typedef boost::shared_mutex Mutex; 
typedef boost::shared_lock<Mutex> ReadLock; 
typedef boost::upgrade_lock<Mutex> UpgradeLock; 
typedef boost::upgrade_to_unique_lock<Mutex> WriteLock; 
Mutex sharedMutex; 


//Multi threaded reader and writer 
{ 
    ReadLock read(sharedMutex); 

    for (int ii = 0; ii < vec.size(); ++ii) { 
     Element e = vec[ii]; 

     if (e.needsUpdating()) { 
      UpgradeLock upgrade(sharedMutex); 

      WriteLock write(upgrade) 

      //Do stuff 
     } 
    } 
} 

यह गतिरोध नहीं है अगर मैं अपग्रेड करने से पहले read.unlock() के साथ पढ़ा ताला अनलॉक में निम्न कोड का परिणाम है। लेकिन ऐसा लगता है कि यह जरूरी नहीं होना चाहिए?

उत्तर

9

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 
     } 
    } 
} 
+0

दुर्भाग्यवश मुझे एक ही समय में लूप में प्रवेश करने में सक्षम होने के लिए एकाधिक पाठकों की आवश्यकता है, इसलिए मैं अपग्रेड लॉक का उपयोग नहीं कर सकता। समझाने के लिए धन्यवाद। –

संबंधित मुद्दे