本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
建立自己的资源管理类
示例:互斥量的资源管理类
void lock(Mutex *pm);//锁定pm所指的互斥器
void unlock(Mutex *pm); //将互斥器解除锁定
class Lock{
public:
explicit Lock(Mutext *pm) : mutexPtr(pm){lock(mutexPtr);} //获得资源
~Lock(){unlock(mutexPtr);}
private:
Mutex *mutexPtr;
}
客户对Lock的用法
Mutex m;//定义你需要的互斥器
{ //建立一个区块用来定义critical section
Lock ml(&m); //锁定互斥器
//… //执行critical section内的操作
} //在区块最末尾,自动解除互斥器锁定
经验:复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
普遍而常见的RAII classcopying行为是:抑制copying,施行引用计数法(reference counting)。不过其他行为也都可能被实现。
示例1:抑制copying
class Lock: private Uncopyable{ //Uncopyable的copying函数是私有的
public:
}
示例2:施行引用计数法
class Lock{
public:
explicit Lock(Mutex *): mutexPtr(pm, unlock)// 以某个Mutex初始化shared_ptr,并 // unlock函数为删除器
{
lock(mutexPtr.get());
}
private:
std::tr1::shared_ptr<Mutex> mutexPtr;//使用shared_ptr替代raw pointer
}