每天学一点 -- CCriticalSection临界区

来源:互联网 发布:mysql的sql语句 编辑:程序博客网 时间:2024/06/06 20:13

(转)类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了运行线程的权力,而把其他线程统统阻塞。

如此的话,每个线程共享一个CCriticalSection变量,只要CCriticalSection->lock和Unlock就能达到目的!

在一个函数内部,我们可以用一个局部变量的生存空间对应的构造和析构函数来自动调用CCriticalSection的功能,实在是妙极妙极!,如下代码:

--头文件--

//资源锁定
class COM_SERVICE_CLASS CThreadLock
{
//变量定义
private:
INT m_nLockCount;//锁定计数
CCriticalSection &m_CriticalSection; //锁定对象


//函数定义
public:
//构造函数
CThreadLock(CCriticalSection & CriticalSection, bool bLockAtOnce=true);
//析构函数
virtual ~CThreadLock();


//操作函数
public:
//锁定函数
VOID Lock();
//解锁函数 
VOID UnLock();


//状态函数
public:
//锁定次数
inline INT GetLockCount() { return m_nLockCount; }
};

--cpp文件--

//构造函数
CThreadLock::CThreadLock(CCriticalSection & CriticalSection, bool bLockAtOnce) 
: m_CriticalSection(CriticalSection)
{
//设置变量
m_nLockCount=0;


//锁定对象
if (bLockAtOnce==true)
{
Lock();
}


return;
}


//析构函数
CThreadLock::~CThreadLock()
{
//解除锁定
while (m_nLockCount>0)
{
UnLock();
}


return;
}


//锁定函数
VOID CThreadLock::Lock()
{
//锁定对象
m_nLockCount++;
m_CriticalSection.Lock();


return;
}


//解锁函数
VOID CThreadLock::UnLock()
{
//效验状态
ASSERT(m_nLockCount>0);
if (m_nLockCount==0) return;


//解除锁定
m_nLockCount--;
m_CriticalSection.Unlock();


return;
}


如果哪里要用到临界区,CThreadLock lock(m_CriticalSection);直接调用就可以了 ~~ 妙

0 0
原创粉丝点击