Windows編程-- 對Critical Section的封裝

來源:互聯網
上載者:User

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.