資源取得時機便是初始化時機
class Mutex{};
void lock(Mutex* p){}
void unlock(Mutex* p){}
class Lock
{
public:
explicit Lock(Mutex *p)
:mutexPtr(p)
{
lock(mutexPtr);
}
~Lock()
{
unlock(mutexPtr);
}
private:
Mutex *mutexPtr;
};
爲確保不會忘記解鎖Mutex互斥對象,可能會設計一個class來管理
用戶對Lock的用法:
Mutex m;
{
Lock m1(&m);//鎖定互斥鎖
} //在區塊最末尾,自動接觸互斥鎖鎖定
Lock m1(&m);
Lock m2(m1);
如果試圖複製Lock對象怎麼辦?!
1.禁止複製,通過聲明private拷貝構造函數或者私有繼承自己定義Uncopyable類
2.對底層資源祭出“引用計數法”
比如shared_ptr
並且將缺省行爲“當引用次數爲0時刪除所指物”改成解鎖
(shared_ptr允許制定所謂的“刪除器”)
class Mutex{};
void lock(Mutex* p){cout << "lock" << endl;}
void unlock(Mutex* p){cout << "unlock" << endl;}
class Lock
{
public:
explicit Lock(Mutex *p)
:mutexPtr(p,unlock)
{
lock(mutexPtr.get());
//返回Mutex類型的指針
}
private:
shared_ptr<Mutex>mutexPtr;
};
int main()
{
Mutex m;
{
cout << "---------------------" << endl;
Lock m1(&m);
cout << "---------------------" << endl;
Lock m2(m1);
cout << "---------------------" << endl;
}
return 0;
}