天天看點

每天學一點 -- CCriticalSection臨界區

(轉)類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);直接調用就可以了 ~~ 妙

繼續閱讀