The first class is a simple wrapper of CRITICAL_SECTION. The second class provides a scoped lock. Even an exception occurs, the destructor of CGuard can automatically release the lock.
static CThreadMutext g_lockSomething;
// a function that want to access some thing
...
CGuard<CThreadMutext> guard(lockSomething);
// A c++ class wrapper to simplify the use of CRITICAL_SECTION class CThreadMutex { public: CThreadMutex() { ::InitializeCriticalSection(&m_cs); } ~CThreadMutex() { ::DeleteCriticalSection(&m_cs); } void Enter() const { ::EnterCriticalSection((LPCRITICAL_SECTION)&m_cs); } void Leave() const { ::LeaveCriticalSection((LPCRITICAL_SECTION)&m_cs); }
#if(_WIN32_WINNT >= 0x0400) BOOL TryEnter() const { return ::TryEnterCriticalSection((LPCRITICAL_SECTION)&m_cs); } #endif /* _WIN32_WINNT >= 0x0400 */
private: CRITICAL_SECTION m_cs;
HIDDEN_COPY(CThreadMutex); MEM_LEAK_DETECT; };
// Gurad class that use stack to autoly perform lock and unloack action template <class MUTEX> class CGuard { public: CGuard(const MUTEX& mutex) :m_oMutex(mutex) { m_oMutex.Enter(); } ~CGuard() { m_oMutex.Leave(); } private: const MUTEX& m_oMutex; CGuard(const CGuard&); CGuard& operator = (const CGuard&); }; 
|