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