线程托管对象的方法

文档序号:6482503阅读:190来源:国知局
专利名称:线程托管对象的方法
技术领域
本发明涉及一种托管对象的方法,尤其涉及一种线程托管对象的方法。
背景技术
进行构件编程时,通过引用计数管理对象的生命周期,当不再使用一个对象时,要 通过调用Release方法释放对对象的引用。但是,在主函数MainO通过return返回时,并不表示这个线程结束,而只是离开 了用户的代码,进入消息循环,如果用户注册了某个对象的回调事件,想获得它的某个事件 通知,那么就必须拿着该对象的一次引用,以保证整个消息循环运行期间这个对象都保持 有效。当消息循环结束之后,线程真正准备退出之时,需要释放对这个对象的引用,可此时 已经离开了用户代码,用户只能想办法注册消息循环结束的回调事件,并在回调函数里释 放该对象。另外,如果某个对象在整个线程运行期间都要被引用,但中间可能会因为运行时 错误而中断退出,那么用户就要在每个退出点释放对象。

发明内容
鉴于以上内容,有必要提供一种线程托管对象的方法,通过对象托管,可以在线程 结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不 必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。一种线程托管对象的方法,该方法包括如下步骤步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;及步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放 对象,执行结束。 相较于现有技术,程序员可以借助设置一个线程托管对象链表,对线程中的对象 进行托管,通过托管,当线程结束时,自动释放被托管对象的一次引用。通过线程托管在主 函数MainO方法里托管一个对象,当线程即将结束时自动释放一次引用,用户既不必担心 线程运行期间对象的有效性,也不必费事地找时机释放对象。此外,通过托管来管理对象的生命周期,会在线程结束时自动释放对象,用户就不 必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏 释放的情况,从而减轻用户的负担。


图1是本发明线程托管对象的方法较佳实施例的主流程图。图2是图1中步骤S30的细化流程图。
图3是图1中步骤S40的细化流程图。
具体实施例方式如图1所示,是本发明线程托管对象的方法较佳实施例的流程图。在本较佳实施 例中,首先以如下构建的代码来进行说明用户定义的线程函数代码ECode UserRoutine (…){CFoo New (&pFoo);CObjectReleaseAtThreadQuit(pFoo);Return N0ERR0R ;// 退出}主函数代码ECode ElastosMain (…){IThread氺pThreadCThread::New(&UserRoutine,0, NULL, &pThread) ;// 创建一个新线程 UserRoutinepThread- > Join (INFINITE, NULL) ;// 等待线程结束return N0ERR0R_EXIT ;//直接退出程序}用图1所示的流程描述上述构建的代码。步骤S10 在主函数中创建一个线程。该线程运行用于执行用户定义的线程函 数。具体而言,上述主函数的代码中,首先声明一个线程指针PThread,然后通过创建动 作,即CThread: :New(&UserRoutine,0, NULL, &pThread),创建一个线程,该线程名称为 UserRoutine。步骤S20 执行线程的入口函数,在线程的入口函数中调用线程函数。入口函数的 具体代码如下ECode ThreadEntry (PVoid pParam)//线程的入 口函数{ECode ec =(氺pUserFunc) (pParam);CleanupListO ;//清理线程托管对象链表}。上述代码中ECode ec = UserFunc (pParam)为调用线程函数,其中pParam为参数, 具体而言,在本较佳实施例中,调用的线程函数为UserRoutine ()。步骤S30 将线程函数中的对象指针插入到线程托管对象链表。具体代码如下CObjectReleaseAtThreadQuit (pFoo);通过调用函数ReleaseAtThreadQuit ()将对象指针pFoo插入到线程托管对象链 表。所述插入的步骤在图2中再做详细描述。
4
步骤S40 当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释 放对象,执行结束。从执行的结果可以看到,通过CObject ReleaseAtThreadQuit (pFoo)调用 ReleaseAtThreadQuitO函数即可将当前线程中的对象进行托管,当线程结束时,会自动调 用被托管的对象指针,并释放对象。在本较佳实施例中,线程函数中被托管的对象是一个构件对象。此外,用户也可以为一个线程中的多个对象进行托管,这些线程托管对象会在线 程结束退出时按照托管顺序的相反顺序被调用执行。在本较佳实施例中,线程UserRoutine 中的对象指针为pFoo,当线程UserRoutine执行完毕时,释放该对象。如图2所示,是图1中步骤S30中将线程函数中的对象指针插入到线程托管对 象链表的细化流程图。线程函数通过调用函数ReleaseAtThreadQuitO将对象指针插 入到托管对象链表,之后执行ReleaseAtThreadQuitO函数。在本较佳实施例中,所述 ReleaseAtThreadQuitO 函数代码如下ECode CObjectReleaseAtThreadQuit (PInterface pObject)CList*pList ;{CThread: :GetTls0bject (TLS_AutoReleaseList, &pList) ;// 从 TLS 上获得线 程托管对象链表If (pList == NULL){pList = new CList ;CThread::SetTlsObject(TLS_AutoReleaseList,pList);}pList-> Insert (pObject);return N0ERR0R ;}用图2所示的流程描述上述构建的代码。步骤S301,声明一个线程托管对象链表的类指针。具体而言,代码为 CList^pList。步骤S302,通过所述声明的类指针创建一个线程托管对象链表的类对象,实现一 个线程托管对象链表。具体而言,代码为pList = new CList。步骤S303,将线程函数中的对象指针插入到线程托管对象链表,即完成了托管线 程函数中的对象。具体而言,代码为pList-> Insert (pObject)。在本较佳实施例中,插入 的线程托管对象指针为PFoo。此外,由于线程函数的对象在第一次托管之后,线程托管对象链表已经存在,当线 程函数需要多个对象被托管时,为保证每个线程中只有一个线程托管对象链表,可以直接 将线程函数中对象指针插入到已经存在的线程托管对象链表中。具体做法为判断线程托 管对象链表是否为空,若不为空,直接将对象指针插入到线程托管对象链表中。具体而言, 代码如下
If (pList == NULL) {...}pList- > Insert(pEntry, pUserData)。如图3所示,是图1中步骤S40中调用线程托管对象链表中的对象指针的细化流 程图。每个线程都有Thread Local Storage (TLS 线程本地存储)槽,占用一个TLS槽来 保存一个线程托管对象链表,当线程即将结束的时候会自动检查这个链表,如果不为空则 遍历它,并释放每个成员对象,从而实现线程托管对象链表的调用。在本较佳实施例中,调 用线程托管对象链表代码如下ECode CleanupList (){CThread::GetTlsObject(TLS_AutoReleaseList, &pList);If (pList == NULL){Return N0ERR0R ;}pHeader = pList ;pList = pList- > Prev();While (pList ! = pHeader) {//遍历线程托管对象链表,并调用Release方法释放 对象pList- > GetCurrent (&p0bj) ;//获取线程托管对象链表当前节点的对象指针pObj- > Release () ;//释放被托管的对象pList = pList- > PrevO ;//继续反向遍历线程托管对象链表}Delete pList ;}用图3所示的流程描述上述构建的代码。步骤S401,在线程函数的TLS槽中获取线程托管对象链表。具体代码为 CThread::GetTls0bject(TLS_AutoCallList, &pList)。步骤S402,判断线程托管对象链表是否为空。具体代码为If (pList = = NULL)。步骤S403,若线程托管对象链表是不为空,则遍历线程托管对象链表,获取线程托 管对象链表中的对象指针,通过获取的对象指针释放对象。在本较佳实施例子中,遍历的方 式是反向遍历线程托管对象链表,即按照倒序的方式依次读取线程托管对象链表中的数 据。步骤S404,判断线程托管对象链表是否遍历完毕。步骤S405,若线程托管对象链表遍历完毕,则删除线程托管对象链表,之后流程结 束。具体代码为Delete pList。在步骤S402中,若线程托管对象链表是为空,则直接结束流程。具体代码为If (pList == NULL)
6
{Return N0ERR0R ;// 直接退出}在步骤S404中,若线程托管对象链表没有遍历完毕,则转到步骤S403。最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参 照以上较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本 发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。
权利要求
一种线程托管对象的方法,其特征在于,该方法包括如下步骤步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;及步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。
2.如权利要求1所述的线程托管对象的方法,其特征在于,所述步骤3包括如下步骤 声明一个线程托管对象链表的类指针;通过所述声明的类指针创建一个线程托管对象链表的类对象,实现一个线程托管对象 链表;及将线程函数中的对象指针插入到线程托管对象链表中。
3.如权利要求2所述的线程托管对象的方法,其特征在于,所述线程托管对象链表存 放在该线程的线程本地存储槽中。
4.如权利要求2所述的线程托管对象的方法,其特征在于,所述步骤4包括如下步骤 获取线程托管对象链表;判断线程托管托管对象链表是否为空;当若线程托管对象链表不为空,遍历线程托管对象链表,获取线程托管对象链表中的 对象指针,并通过获取的对象指针释放对象;当线程托管对象链表遍历完毕,删除线程托管对象链表;及 若线程托管对象链表为空,则执行结束。
5.如权利要求4所述的线程托管对象的方法,其特征在于,所述遍历的方式为反向遍历。
全文摘要
一种线程托管对象的方法,该方法包括如下步骤步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。利用本发明通过对象托管,可以在线程结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。
文档编号G06F9/46GK101866298SQ200910049219
公开日2010年10月20日 申请日期2009年4月14日 优先权日2009年4月14日
发明者宋世军, 沈金, 陈榕 申请人:上海科泰世纪科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1