CN101866298A - 线程托管对象的方法 - Google Patents
线程托管对象的方法 Download PDFInfo
- Publication number
- CN101866298A CN101866298A CN200910049219A CN200910049219A CN101866298A CN 101866298 A CN101866298 A CN 101866298A CN 200910049219 A CN200910049219 A CN 200910049219A CN 200910049219 A CN200910049219 A CN 200910049219A CN 101866298 A CN101866298 A CN 101866298A
- Authority
- CN
- China
- Prior art keywords
- thread
- chained list
- managed object
- function
- pointer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Computer And Data Communications (AREA)
- Information Transfer Between Computers (AREA)
Abstract
一种线程托管对象的方法,该方法包括如下步骤:步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。利用本发明通过对象托管,可以在线程结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。
Description
技术领域
本发明涉及一种托管对象的方法,尤其涉及一种线程托管对象的方法。
背景技术
进行构件编程时,通过引用计数管理对象的生命周期,当不再使用一个对象时,要通过调用Release方法释放对对象的引用。
但是,在主函数Main()通过return返回时,并不表示这个线程结束,而只是离开了用户的代码,进入消息循环,如果用户注册了某个对象的回调事件,想获得它的某个事件通知,那么就必须拿着该对象的一次引用,以保证整个消息循环运行期间这个对象都保持有效。当消息循环结束之后,线程真正准备退出之时,需要释放对这个对象的引用,可此时已经离开了用户代码,用户只能想办法注册消息循环结束的回调事件,并在回调函数里释放该对象。
另外,如果某个对象在整个线程运行期间都要被引用,但中间可能会因为运行时错误而中断退出,那么用户就要在每个退出点释放对象。
发明内容
鉴于以上内容,有必要提供一种线程托管对象的方法,通过对象托管,可以在线程结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。
一种线程托管对象的方法,该方法包括如下步骤:
步骤1,在主函数中创建一个线程;
步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;
步骤3,将线程函数中的对象指针插入到线程托管对象链表;及
步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。
相较于现有技术,程序员可以借助设置一个线程托管对象链表,对线程中的对象进行托管,通过托管,当线程结束时,自动释放被托管对象的一次引用。通过线程托管在主函数Main()方法里托管一个对象,当线程即将结束时自动释放一次引用,用户既不必担心线程运行期间对象的有效性,也不必费事地找时机释放对象。
此外,通过托管来管理对象的生命周期,会在线程结束时自动释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。
附图说明
图1是本发明线程托管对象的方法较佳实施例的主流程图。
图2是图1中步骤S30的细化流程图。
图3是图1中步骤S40的细化流程图。
具体实施方式
如图1所示,是本发明线程托管对象的方法较佳实施例的流程图。在本较佳实施例中,首先以如下构建的代码来进行说明:
用户定义的线程函数代码:
ECode UserRoutine(...)
{
CFoo::New(&pFoo);
CObject::ReleaseAtThreadQuit(pFoo);
Return NOERROR;//退出
}
主函数代码:
ECode ElastosMain(...)
{
IThread*pThread
CThread::New(&UserRoutine,0,NULL,&pThread);//创建一个新线程UserRoutine
pThread->Join(INFINITE,NULL);//等待线程结束
return NOERROR_EXIT;//直接退出程序
}
用图1所示的流程描述上述构建的代码。
步骤S10:在主函数中创建一个线程。该线程运行用于执行用户定义的线程函数。具体而言,上述主函数的代码中,首先声明一个线程指针pThread,然后通过创建动作,即:CThread::New(&UserRoutine,0,NULL,&pThread),创建一个线程,该线程名称为UserRoutine。
步骤S20:执行线程的入口函数,在线程的入口函数中调用线程函数。入口函数的具体代码如下:
ECode ThreadEntry(PVoid pParam)//线程的入口函数
{
ECode ec=(*pUserFunc)(pParam);
CleanupList();//清理线程托管对象链表
}。
上述代码中ECode ec=UserFunc(pParam)为调用线程函数,其中pParam为参数,具体而言,在本较佳实施例中,调用的线程函数为UserRoutine()。
步骤S30:将线程函数中的对象指针插入到线程托管对象链表。具体代码如下:
CObject::ReleaseAtThreadQuit(pFoo);
通过调用函数ReleaseAtThreadQuit()将对象指针pFoo插入到线程托管对象链表。所述插入的步骤在图2中再做详细描述。
步骤S40:当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。
从执行的结果可以看到,通过CObject::ReleaseAtThreadQuit(pFoo)调用ReleaseAtThreadQuit()函数即可将当前线程中的对象进行托管,当线程结束时,会自动调用被托管的对象指针,并释放对象。
在本较佳实施例中,线程函数中被托管的对象是一个构件对象。
此外,用户也可以为一个线程中的多个对象进行托管,这些线程托管对象会在线程结束退出时按照托管顺序的相反顺序被调用执行。在本较佳实施例中,线程UserRoutine中的对象指针为pFoo,当线程UserRoutine执行完毕时,释放该对象。
如图2所示,是图1中步骤S30中将线程函数中的对象指针插入到线程托管对象链表的细化流程图。线程函数通过调用函数ReleaseAtThreadQuit()将对象指针插入到托管对象链表,之后执行ReleaseAtThreadQuit()函数。在本较佳实施例中,所述ReleaseAtThreadQuit()函数代码如下:
ECode CObject::ReleaseAtThreadQuit(PInterface pObject)
CList*pList;
{
CThread::GetTlsObject(TLS_AutoReleaseList,&pList);//从TLS上获得线程托管对象链表
If(pList==NULL)
{
pList=new CList;
CThread::SetTlsObject(TLS_AutoReleaseList,pList);
}
pList->Insert(pObject);
return NOERROR;
}
用图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 NOERROR;
}
pHeader=pList;
pList=pList->Prev();
While(pList!=pHeader){//遍历线程托管对象链表,并调用Release方法释放对象
pList->GetCurrent(&pObj);//获取线程托管对象链表当前节点的对象指针
pObj->Release();//释放被托管的对象
pList=pList->Prev();//继续反向遍历线程托管对象链表
}
Delete pList;
}
用图3所示的流程描述上述构建的代码。
步骤S401,在线程函数的TLS槽中获取线程托管对象链表。具体代码为CThread::GetTlsObject(TLS_AutoCallList,&pList)。
步骤S402,判断线程托管对象链表是否为空。具体代码为If(pList==NULL)。
步骤S403,若线程托管对象链表是不为空,则遍历线程托管对象链表,获取线程托管对象链表中的对象指针,通过获取的对象指针释放对象。在本较佳实施例子中,遍历的方式是反向遍历线程托管对象链表,即:按照倒序的方式依次读取线程托管对象链表中的数据。
步骤S404,判断线程托管对象链表是否遍历完毕。
步骤S405,若线程托管对象链表遍历完毕,则删除线程托管对象链表,之后流程结束。具体代码为Delete pList。
在步骤S402中,若线程托管对象链表是为空,则直接结束流程。具体代码为:
If(pList==NULL)
{
Return NOERROR;//直接退出
}
在步骤S404中,若线程托管对象链表没有遍历完毕,则转到步骤S403。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照以上较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。
Claims (5)
1.一种线程托管对象的方法,其特征在于,该方法包括如下步骤:
步骤1,在主函数中创建一个线程;
步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;
步骤3,将线程函数中的对象指针插入到线程托管对象链表;及
步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。
2.如权利要求1所述的线程托管对象的方法,其特征在于,所述步骤3包括如下步骤:
声明一个线程托管对象链表的类指针;
通过所述声明的类指针创建一个线程托管对象链表的类对象,实现一个线程托管对象链表;及
将线程函数中的对象指针插入到线程托管对象链表中。
3.如权利要求2所述的线程托管对象的方法,其特征在于,所述线程托管对象链表存放在该线程的线程本地存储槽中。
4.如权利要求2所述的线程托管对象的方法,其特征在于,所述步骤4包括如下步骤:
获取线程托管对象链表;
判断线程托管托管对象链表是否为空;
当若线程托管对象链表不为空,遍历线程托管对象链表,获取线程托管对象链表中的对象指针,并通过获取的对象指针释放对象;
当线程托管对象链表遍历完毕,删除线程托管对象链表;及
若线程托管对象链表为空,则执行结束。
5.如权利要求4所述的线程托管对象的方法,其特征在于,所述遍历的方式为反向遍历。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200910049219 CN101866298B (zh) | 2009-04-14 | 2009-04-14 | 线程托管对象的方法 |
HK11102970.7A HK1148841A1 (en) | 2009-04-14 | 2011-03-24 | Method for depositing an object by a thread |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200910049219 CN101866298B (zh) | 2009-04-14 | 2009-04-14 | 线程托管对象的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101866298A true CN101866298A (zh) | 2010-10-20 |
CN101866298B CN101866298B (zh) | 2013-08-07 |
Family
ID=42958033
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200910049219 Expired - Fee Related CN101866298B (zh) | 2009-04-14 | 2009-04-14 | 线程托管对象的方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN101866298B (zh) |
HK (1) | HK1148841A1 (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1325069A (zh) * | 2000-05-15 | 2001-12-05 | 松下电器产业株式会社 | 应用执行装置及方法 |
CN1567250A (zh) * | 2003-06-11 | 2005-01-19 | 中兴通讯股份有限公司 | 一种高速零碎片的小对象内存结构及分配方法 |
CN101271428A (zh) * | 2008-02-25 | 2008-09-24 | 北京理工大学 | 一种对象数据存储管理的装置和方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1266590C (zh) * | 2002-12-31 | 2006-07-26 | 上海科泰世纪科技有限公司 | 面向构件基于系统内核的进程池/线程池管理方法 |
JP4569926B2 (ja) * | 2003-06-30 | 2010-10-27 | パナソニック株式会社 | ガーベジコレクションシステム |
CN100395710C (zh) * | 2005-05-27 | 2008-06-18 | 华为技术有限公司 | 一种多线程应用程序访问数据库的方法 |
-
2009
- 2009-04-14 CN CN 200910049219 patent/CN101866298B/zh not_active Expired - Fee Related
-
2011
- 2011-03-24 HK HK11102970.7A patent/HK1148841A1/xx not_active IP Right Cessation
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1325069A (zh) * | 2000-05-15 | 2001-12-05 | 松下电器产业株式会社 | 应用执行装置及方法 |
CN1567250A (zh) * | 2003-06-11 | 2005-01-19 | 中兴通讯股份有限公司 | 一种高速零碎片的小对象内存结构及分配方法 |
CN101271428A (zh) * | 2008-02-25 | 2008-09-24 | 北京理工大学 | 一种对象数据存储管理的装置和方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101866298B (zh) | 2013-08-07 |
HK1148841A1 (en) | 2011-09-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CA2991131C (en) | Method and architecture for providing database access control in a network with a distributed database system | |
US7805482B2 (en) | Method of correlating events in data packet streams | |
US8661441B2 (en) | Transaction load reduction for process completion | |
US20140019986A1 (en) | Managing multi-threaded operations in a multimedia authoring environment | |
Litvak et al. | Behavioral consistency validation of UML diagrams | |
CN102129391A (zh) | 一种数据库中自旋锁的实现方法 | |
CN106528065B (zh) | 一种线程获取方法及设备 | |
US20100161572A1 (en) | Concurrency management in cluster computing of business applications | |
CN101866298B (zh) | 线程托管对象的方法 | |
CN115629737A (zh) | 流程编排引擎的实现方法和流程编排引擎系统 | |
Xuandong et al. | Timing analysis of UML activity diagrams | |
CN108345505B (zh) | 一种多线程资源管理方法和系统 | |
CN101866300A (zh) | 线程托管函数的方法 | |
CN105843735B (zh) | 一种终端内存的消耗方法及装置 | |
CN104063287A (zh) | 进程管理方法及装置 | |
CN112052094A (zh) | 一种基于多线程的任务执行方法 | |
CN101788905A (zh) | Applet托管对象的方法 | |
CN112256443A (zh) | 一种基于redis的动态集群锁系统 | |
CN112822250B (zh) | 一种大数据平台去中心化的调度和执行方法、装置 | |
Soares et al. | Concurrency manager | |
Chang et al. | Transformation from activity diagrams with time properties to Timed Coloured Petri Nets | |
CN116700938B (zh) | 一种交易审批业务的流程处理方法、电子设备及存储介质 | |
Petridis et al. | Temporal model for business process | |
CN106293884A (zh) | 一种消息驱动系统中无效超时消息的检测方法 | |
CN103150485B (zh) | 一种节点之间的依赖关系系统及其运行方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 1148841 Country of ref document: HK |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: GR Ref document number: 1148841 Country of ref document: HK |
|
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130807 Termination date: 20160414 |
|
CF01 | Termination of patent right due to non-payment of annual fee |