2011-10-23 14 views
6

मेरे छोटा, सरल बनाया वर्ग के रूप में निम्नानुसार है:"नेस्ट" scoped_lock

class A 
{ 
    public: 
    // ... 
    methodA(); 
    methodB(); 

    protected: 
    mutable boost::mutex m_mutex; 
    sometype* m_myVar; 
} 

A::methodA(int someParam) 
{ 
    boost::mutex::scoped_lock myLock(m_mutex); 
    m_myVar->doSomethingElse(); 
} 

A::methodB(int someParam) 
{ 
    boost::mutex::scoped_lock myLock(m_mutex); 
    m_myVar->doSomething(); 
    this->methodA(someParam); 
} 

मैं m_myVar पर पहुँच सिंक्रनाइज़ करना चाहते हैं। जब A::methodB() बुला, धागा दो बार और स्पष्ट रूप से A::methodA()

की पहली पंक्ति पर ब्लॉक एक ही म्युटेक्स साथ लॉक में चलाता है वहाँ जब फिर से गुजर एक ही धागे अवरुद्ध नहीं scoped_lock बनाने के लिए कोई तरीका है?

निश्चित रूप से, मैं बस m_mutex.unlock() पर कॉल कर सकता हूं। लेकिन यह अन्य थ्रेड लॉक पर भी इंतजार कर देगा - जो बिल्कुल मैं नहीं चाहता हूं।

कोई विचार?

सादर टोबियास

+8

'बूस्ट :: mutex' – BatchyX

उत्तर

12

यह boost::recursive_mutex है क्योंकि यह कई बार डेडलॉकिंग के बिना उसी थ्रेड द्वारा लॉक प्राप्त करने की अनुमति देता है। boost::mutex

+1

+1: आप स्पष्ट बताते हुए प्रतीत होते हैं: पी धन्यवाद! – Atmocreations

0

आप MethodA में tryLock उपयोग कर सकते हैं, तो कोशिश में विफल रहा है आप वर्तमान threadid हो और निष्पादन के साथ जारी रखने केवल तभी धागा आईडी जो MethodB.Otherwise अगर चलाता threadid के साथ एक ही है चाहिए प्रयास सफल होता है आप सामान्य रूप से निष्पादन के साथ जारी रख सकते हैं।

+1

के बजाय' boost :: recursive_mutex' का उपयोग करें, ऐसा होने की प्रतीक्षा में दौड़ की स्थिति की तरह लगता है। – user786653

+0

आम तौर पर मेरी राय में सबसे अच्छा जवाब बैचएक्स की टिप्पणी है। लेकिन मुझे वास्तव में यहां कोई दौड़ की स्थिति नहीं दिख रही है। क्या आप कृपया मुझे समझा सकते हैं? – AlexTheo

+0

क्षमा करें, अधिक विचार के साथ आप शायद सही काम कर सकते हैं इसे काम करने के लिए बनाया जा सकता है। – user786653

4

ऐसी कई चीजें हैं जो आप यहां कर सकते हैं। आप एक रिकर्सिव म्यूटेक्स का उपयोग कर सकते हैं जिसे एक ही थ्रेड के भीतर कई बार अधिग्रहित किया जा सकता है, या आप कार्यान्वयन के साथ methodA को एक निजी विधि में विभाजित कर सकते हैं और कोई ताले और सार्वजनिक विधि जो ताले और फिर निजी कार्यान्वयन को कॉल करती है। फिर methodB ताला पकड़े हुए आंतरिक कार्यान्वयन को कॉल करेगा। चूंकि विधि निजी है, इसलिए आपके पास सभी उपयोगों पर नियंत्रण होता है और आप यह सुनिश्चित कर सकते हैं कि कार्यान्वयन विधि को केवल लॉक रखने के दौरान ही बुलाया जाता है।

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