资源取得时机便是初始化时机
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;
}