मेरे पास एक क्लास इंस्टेंस है जिसका उपयोग अन्य थ्रेडों में संवाद करने के लिए कई अन्य वर्गों द्वारा किया जाता है।क्या एक सिंगल राइट/एकाधिक रीड लॉक का डेडलॉक हो सकता है?
static unsigned int readCounter = 0;
class CReadLock
{
public:
CReadLock(SRWLOCK& Lock) : m_Lock(Lock) { InterlockedIncrement(&readCounter); AcquireSRWLockShared(&m_Lock); }
~CReadLock() {ReleaseSRWLockShared(m_Lock); InterlockedDecrement(&readCounter);}
private:
SRWLOCK& m_Lock;
};
class CWriteLock
{
public:
CWriteLock(SRWLOCK& Lock) : m_Lock(Lock) { AcquireSRWLockExclusive(&m_Lock); }
~CWriteLock() { ReleaseSRWLockExclusive(&m_Lock); }
private:
SRWLOCK& m_Lock;
};
समस्या
पूरी बात गतिरोध है:
इस वर्ग वास्तव में लॉक करने के लिए/बात अनलॉक एक तुल्यकालन वस्तु के रूप में एक स्लिम रीडर/राइटर ताला (WinAPI के SRWLOCK
) और आरए II सहायक वर्गों की एक जोड़ी का उपयोग करता है पुरे समय। जब मैं डेडलॉक प्रोग्राम को रोकता हूं, तो मैं देखता हूं:
AcquireSRWLockExclusive()
में एक थ्रेड फंस गया;AcquireSRWLockShared()
में फंस गए दो धागे;readCounter
वैश्विक 3.
के लिए रास्ता मैं इसे देखना सेट किया गया है, इस के लिए एक ही रास्ता होने की CReadLock
उदाहरण नाशक किसी भी तरह कहीं तो ताला सदा अवरुद्ध हो गया है कहा जाता है नहीं किया गया है। हालांकि, ऐसा होने का एकमात्र तरीका (जहां तक मुझे पता है) क्योंकि एक अपवाद फेंक दिया गया है। यह नहीं था। मैंने जाँचा।
समस्या क्या हो सकती है? मुझे इस बात को ठीक करने (या कम से कम इस कारण का पता लगाने) के बारे में कैसे जाना चाहिए?
'बार' को लॉक नहीं करना चाहिए? अगर 'foo' कॉलिंग' baz' (पता नहीं है कि ताले रिकर्सिव हैं) – Lol4t0
आवश्यक नहीं है, तो Win32 API 'AcquireSRWLockShared' ** रिकर्सिव नहीं है ** POSIX के' pthread_rwlock_rdlock' या 'EnterCriticalSection' के विपरीत) – Artyom
क्या आप साबित कर सकते हैं कि 'बाज लिखने के लिए अब पूछता है कि सभी पढ़े गए ताले तब तक अवरुद्ध हो जाएंगे जब तक सभी रिलीज़ नहीं हो जाते - इंतजार करते हैं।' चूंकि एमएसडीएन [कहता है] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937%28v=vs.85%29.aspx): 'ऑर्डर के बारे में कोई गारंटी नहीं है जिसमें थ्रेड उस अनुरोध स्वामित्व को स्वामित्व दिया जाएगा; एसआरडब्ल्यू ताले न तो निष्पक्ष और न ही फीफो हैं। ' – Lol4t0