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;}