// 方法一: Lock中的CritSect成员变量必须是引用类型。
class CritSect
{
public:
friend class Lock;
CritSect() { InitializeCriticalSection(&_critSection); }
~CritSect() { DeleteCriticalSection(&_critSection); }
private:
void Acquire(){EnterCriticalSection(&_critSection);}
void Release(){LeaveCriticalSection(&_critSection);}
CRITICAL_SECTION _critSection;
};
class Lock
{
public:
Lock(CritSect& critSect):_critSect(critSect) { _critSect.Acquire();}
~Lock(){_critSect.Release();}
private:
CritSect& _critSect;
};
//
// 方法2 比较简单 很好理解
class CLock {
public:
CLock() { InitializeCriticalSection (&m_criticalSection); }
void Lock () { EnterCriticalSection (&m_criticalSection);}
void Unlock () { LeaveCriticalSection (&m_criticalSection);}
virtual ~CLock() { DeleteCriticalSection (&m_criticalSection);}
private:
CRITICAL_SECTION m_criticalSection;
};
//
class CScopedLocker {
public:
CScopedLocker (CLock* t) : m_lock(t){ m_lock->Lock(); }
~CScopedLocker() { m_lock->Unlock(); }
private:
CLock * m_lock;
};
说明 :
1 用法:用类定义一个对象, 然后调用函数。 如下:
CritSect sect;
Lock lock(sect);
或
CLock t;
CSCopedLocker st(&t);
2 但是,感觉这两种方法用的时候不是最安全的。具体的可以看一下《Effective C++》里面的条款13: 以对象管理资源。里面讲更好些。
FangSH 15:44 2011-1-5