// 方法一: 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