Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Home » Tip Bank » C++
Language: C++
Expertise: Intermediate
Sep 9, 2002

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;
}
Vinayak Raghuvamshi
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date