码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ Item 14-在资源管理中小心的copying行为

时间:2016-08-24 13:14:15      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

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);    //将互斥器解除锁定

Note:Mutex是Windows中用于对线程控制的互斥量。意思是只能有一个线程取得对它的占有权,因为有些业务只允许一个线程进行控制。打个比方:一个房间每次只允许一个人进去,而当有多个人需要使用那个房间时,就需要进行控制,其他人必须排队,这个控制就需要设置一个互斥量。

为确保绝不忘记将一个被锁住的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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!