在C++中,通過(guò)提供構(gòu)造函數(shù)、析構(gòu)函數(shù)來(lái)對(duì)處理資源的獲取、釋放。
通過(guò)C++的這種機(jī)制,我們可以很方便地處理C++中的加鎖同步機(jī)制。把鎖對(duì)象作為Guard對(duì)象的一個(gè)成員(m_lock),然后在Guard對(duì)象的構(gòu)造中對(duì)m_lock進(jìn)行加鎖:m_lock.acquire(),在Guard對(duì)象的析構(gòu)函數(shù)中進(jìn)行解鎖:m_lock.release()。先給出代碼實(shí)例如下:
template <class T>
class Guard
{
public :
Guard(const T & lock);
virtual ~Guard();
private:
const T & m_lock;
};
template <class T>
Guard<T>::Guard(const T & lock) :
m_lock(lock)
{
m_lock.acquire();
}
template <class T>
Guard<T>::~Guard()
{
m_lock.release();
}
我們可以在應(yīng)用程序中這樣使用它:
void testFunc(.....)
{
Guard<MutexWrapper> guard(mutex);
...
}
在剛進(jìn)入函數(shù)testFun(...),創(chuàng)建guard對(duì)象,并自動(dòng)對(duì)mutex進(jìn)行加鎖,對(duì)特定數(shù)據(jù)(resource)進(jìn)行保護(hù)。當(dāng)應(yīng)用離開(kāi)testFunc函數(shù)模塊時(shí),根據(jù)guard對(duì)象的作用域和生命周期,此時(shí)guard對(duì)象的析構(gòu)函數(shù)將被調(diào)用,因此將自動(dòng)對(duì)mutex進(jìn)行解鎖。在此之后應(yīng)用的其他線程將可以訪問(wèn)以前被mutex進(jìn)行保護(hù)起來(lái)的資源。
利用上面的方法,我們可以包對(duì)資源的同步訪問(wèn)和訪問(wèn)控制交給C++的編譯器,而不需要進(jìn)行人工干預(yù),從而減輕應(yīng)用開(kāi)發(fā)人員的工作負(fù)擔(dān)。