Demo 假設我們使用C API函數處理類型爲Mutex的互斥器對象,共有lock和unlock兩函數可用。
void lock(Mutex* pm);
void unlock(Mutex* pm);
class Lock {
public:
explicit Lock(Mutex* pm) : mutexPtr(pm)
{ lock(mutexPtr); } // 獲得資源
~Lock()
{ unlock(mutexPtr); } // 釋放資源
};
// 客戶對Lock的正確用法符合RAII方式
Mutex m; // 定義你需要的互斥器
....
{ // 建立一個區塊用來定義critical section
Lock ml(&m); // 鎖定互斥器
......
} // 在區塊最末尾,自動接觸互斥器鎖定
Lock ml1(&m);
Lock ml2(ml1);
class Lock {
public:
explicit Lock(Mutex* pm) : mutexPtr(pm, unlock)
{
lock(mutexPtr.get());
}
private:
std::tr1LLshared_ptr<Mutex> mutexPtr;
};
- 複製RAII對象必須一併複製它所管理的資源,所以資源的拷貝行爲決定RAII對象的拷貝行爲
- 一般的複製行爲是:阻止拷貝行爲,使用引用計數法(tr1::shared_ptr)