//.h
#ifndef CAutoMutex_h
#define CAutoMutex_h 1
#include <windows.h>
#include <process.h>
class CAutoMutex
{
#undef CAutoMutex
public:
CAutoMutex();
virtual ~CAutoMutex();
virtual void lock ();
virtual void unlock ();
private:
CRITICAL_SECTION m_lock;
};
#endif
//.cpp
#include "Mutex.h"
CAutoMutex::CAutoMutex()
{
::InitializeCriticalSection( &m_lock );
}
CAutoMutex::~CAutoMutex()
{
::DeleteCriticalSection( &m_lock );
}
void CAutoMutex::lock ()
{
::EnterCriticalSection( &m_lock );
}
void CAutoMutex::unlock ()
{
::LeaveCriticalSection( &m_lock );
}
//.h
#ifndef CGuard_h
#define CGuard_h 1
#pragma once
class CAutoMutex;
class CGuard
{
public:
CGuard (CAutoMutex& criticalSection);
virtual ~CGuard();
void acquire ();
void release ();
private:
CGuard();
int m_count;
CAutoMutex &m_criticalSection;
};
#endif
//.cpp
#include "Mutex.h"
#include "Guard.h"
CGuard::CGuard (CAutoMutex& criticalSection)
: m_count(0)
, m_criticalSection( criticalSection )
{
acquire();
}
CGuard::~CGuard()
{
while( m_count > 0 )
release();
}
void CGuard::acquire ()
{
m_criticalSection.lock();
m_count++;
}
void CGuard::release ()
{
m_criticalSection.unlock();
m_count--;
}