devxlogo

Every Call to “EnterCriticalSection” Needs a Matching “LeaveCriticalSetcion”

Every Call to “EnterCriticalSection” Needs a Matching “LeaveCriticalSetcion”

Threads can hang indefinitely if one thread is Entered in a critical section but returned without Leaving it. There is a simple solution to make sure that this doesn’t happen. Wrap the CriticalSection in a class and instantiate it on the stack like this.

 class CSafeCriticalSection{private:	// the pointer to the critical section	LPCRITICAL_SECTION m_pCS;public:	CSafeCriticalSection(LPCRITICAL_SECTION pCS) : m_pCS(pCS)	{		if(m_pCS)			EnterCriticalSection(m_pCS);	}	~CSafeCriticalSection()	{		if(m_pCS)			LeaveCriticalSection(m_pCS);	}};

Then, in any function that uses your critical section (assume you have a critical section called m_CS):

 HRESULT MyClass::Foo(){   CSafeCriticalSection SafeCS(&m_CS);   // DO YOUR WORK HERE   // you can return anywhere   // without worrying about the critical section   return hr;}

devx-admin

Share the Post: