标签:
Item 14-在资源管理中小心的copying行为(Think carefully about copying behavior in resource-managing classes)
auto_ptr和trl::shared_ptr表现在heap_based资源上,然而并非所有资源都是heap_based,这样我们就需要建立自己的资源管理类。
例如:假设我们使用C API(Application Programming Interface)函数处理类型为Mutex的互斥器对象(mutex objects),共有lock和unlock两函数可用:
void lock(Mutex* pm); //锁定pm所指的互斥器 void unlock(Mutex* pm); //将互斥器解除锁定
为确保绝不忘记将一个被锁住的Mutex解锁,你可能会希望建立一个class用来管理机锁。这样的class的基本结构由RAII守则支配,也就是"资源在构造期间获得,在析构期间释放"。
class Lock { public: explicit Lock(Mutex* pm):mutexPtr(pm){Lock(mutexPtr);} //获得资源 ~Lock(){unlock(mutexPtr);} //释放资源 private: Mutex* mutexPtr; };客户对Lock的用法符合RAII方式:
Mutex m; //定义你需要的互斥器 ... { //建立一个区块用来定义critical section Lock ml(&m); //锁定互斥器 ... //执行critical section内的操作 } //在区块最末尾,自动解除互斥器锁定Note:critical section临界区。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码成为临界区。
如果Lock对象被复制;
Lock ml1(&m) //锁定m Lock ml2(ml1) //将ml1复制到ml2身上。?怎么办
1、禁止复制
2、将底层资源使用"引用计数法"(reference-count)
3、复制底部资源
4、转移底部资源的拥有权
请记住:
复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
普遍而常见的RAII class copying行为是:抑制copying、使用引用计数法(reference counting)。不过其他行为也都可能被实现。
Effective C++ Item 14-在资源管理中小心的copying行为
标签:
原文地址:http://blog.csdn.net/u011391629/article/details/52297144