快速业务通道

C++引用计数的智能指针有效回收方法

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
象的反串行化过程使用此tag,在软件恢复时,来重建正确的对象指针实例引用。下面是反串行化过程必须执行的步骤:

² 从存档文件中恢复tag。

² 从tag标识的存档文件中,恢复对象属性。

² 以此tag为界调用impersonate()方法,恢复正确的指针对象的引用。

Impersonate()会对是否一个tag索引了在全局CReferableCache对象集中的一个对象进行检查,如果未找到此tag相应的对象,那么此对象会添加到CReferableCache中,并用此tag作为它的索引值。然而,如果一个对象已经存在于全局CReferableCache对象集中,通过以新引用来调用set()方法,你可以舍弃老引用,且无关的对象复制操作也会自动被删除。例2使用了这种技术来实现智能指针。

例2:

以下是引用片段:
class CJobDef : public CReferable
{
friend CArchive &operator << (CArchive &ar, const CJobDefPtr &cand)
{
ar << cand->getTag();
CArchive ar_def(cand->getTag(), CArchive::WRITE);
// write object attributes to ar_def
return ar;
}
friend CArchive &operator >> (CArchive &ar, CJobDefPtr &cand)
{
int tag;
ar >> tag;
CArchive ar_def(tag, CArchive::READ);
// read object attributes from ar_def
cand.impersonate(tag);
return ar;
}
};
class CJobInst : public CReferable
{
friend CArchive & operator << ( CArchive &ar, const CJobInstPtr &cand)
{
ar << cand->m_defPtr;
return ar;
}
friend CArchive & operator >> (CArchive &ar, CJobInstPtr &cand)
{
CJobDefPtr defPtr = new CJobDef;
ar >> defPtr;
cand->m_defPtr = defPtr;
return ar;
}
};

C++引用计数的智能指针有效回收方法

图4:作业对象与CReferableCache全局对象的交互

图4描述了系统中类CScheduler、CJobDefPtr、CJobDef、CReferableCache之间的交互,类CReferableCache具有静态成员方法getUniqueTag()、addObject()、deleteObject()。当一个对CJobDef的智能指针创建时,如下:

以下是引用片段:
CJobDefPtr jobDefPtr = new CJobDef

CScheduler会构造CJobDefPtr和一个CJobDef对象,当对象构造时,会通过CJobDef基类的CReferable构造函数调用getUniqueTag()方法,这就为每个CJobDef对象创建了一个唯一的识别标记(tag)。接下来,CJobDef对象被赋给CJobDefPtr对象,后者会调用它自己的set()方法把CJobDef对象添加进来。

当调用CJobDefPtr赋值操作符函数时,也会调用addObject()方法,如果是第一次赋值的话,它会把CJobDef对象添加进全局CReferableCache;当智能指针被请求替换由tag识别的它内部的对象引用时,impersonate()方法会调用getObject()方法,如果impersonate()方法未找到CReferableCache中标记的对象,那么,CJobDefPtr对象会替换它的内部对象标记,并把它自身添加到CReferableCache缓存集中;最后,当CJobDefPtr被删除及对象的引用计数为零时,deleteObject()方法此时会被调用。

在此所描述的事件调度系统,一般使用在市场咨询数据公司中,其会在网络集群工作站上触发计算任务,当从世界各处的零售商汇集所需信息之后,在每周的三天之中,都会触发计算任务,而这三天中的任意时刻,系统可能也要在集群工作站上运行超过20万个任务。因此,软件在合理内存及CPU消耗的前提下,支持重新启动,就显得非常重要了。表1显示了在系统中运行着多个计算任务时,事件调度守护进程在每次重启后的内存消耗,在系统重启后,较小的内存消耗要归功于软件中使用了上文方法来串行及反串行化不常用的类对象的那些模块。当任务完成时,内存最终将被回收。

表1:在软件每次重启后的调度系统所用内存大小

运行任务数 软件重启前的内存占用大小 软件重启后的内存占用大小
5000 25M 32M
100000 370M 413M
200000 730M 795M

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号