Windows编程-- 对Critical Section的封装

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

原文地址:https://www.cnblogs.com/fangshenghui/p/1926429.html