CN101866298B - 线程托管对象的方法 - Google Patents

线程托管对象的方法 Download PDF

Info

Publication number
CN101866298B
CN101866298B CN 200910049219 CN200910049219A CN101866298B CN 101866298 B CN101866298 B CN 101866298B CN 200910049219 CN200910049219 CN 200910049219 CN 200910049219 A CN200910049219 A CN 200910049219A CN 101866298 B CN101866298 B CN 101866298B
Authority
CN
China
Prior art keywords
thread
chained list
function
managed object
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.)
Expired - Fee Related
Application number
CN 200910049219
Other languages
English (en)
Other versions
CN101866298A (zh
Inventor
宋世军
陈榕
沈金
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI
Original Assignee
KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI filed Critical KETAI CENTURY SCIENCE AND TECHNOLOGY Co Ltd SHANGHAI
Priority to CN 200910049219 priority Critical patent/CN101866298B/zh
Publication of CN101866298A publication Critical patent/CN101866298A/zh
Priority to HK11102970.7A priority patent/HK1148841A1/xx
Application granted granted Critical
Publication of CN101866298B publication Critical patent/CN101866298B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Abstract

一种线程托管对象的方法,该方法包括如下步骤:步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,将线程函数中的对象指针插入到线程托管对象链表;步骤4,当线程函数执行完毕时,调用线程托管对象链表中插入的对象指针,释放对象,执行结束。利用本发明通过对象托管,可以在线程结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。

Description

线程托管对象的方法
技术领域
本发明涉及一种托管对象的方法,尤其涉及一种线程托管对象的方法。
背景技术
进行构件编程时,通过引用计数管理对象的生命周期,当不再使用一个对象时,要通过调用Release方法释放对对象的引用。
但是,在主函数Main()通过return返回时,并不表示这个线程结束,而只是离开了用户的代码,进入消息循环,如果用户注册了某个对象的回调事件,想获得它的某个事件通知,那么就必须拿着该对象的一次引用,以保证整个消息循环运行期间这个对象都保持有效。当消息循环结束之后,线程真正准备退出之时,需要释放对这个对象的引用,可此时已经离开了用户代码,用户只能想办法注册消息循环结束的回调事件,并在回调函数里释放该对象。
另外,如果某个对象在整个线程运行期间都要被引用,但中间可能会因为运行时错误而中断退出,那么用户就要在每个退出点释放对象。
发明内容
鉴于以上内容,有必要提供一种线程托管对象的方法,通过对象托管,可以在线程结束这一特殊时刻释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。
一种线程托管对象的方法,该方法包括如下步骤:
步骤1,在主函数中创建一个线程;
步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;
步骤3,声明一个线程托管对象链表的类指针,通过所述声明的类指针创建一个线程托管对象链表的类对象,实现一个线程托管对象链表,将线程函数中的对象指针插入到线程托管对象链表,即完成了托管线程函数中的对象;及
步骤4,当线程函数执行完毕时,获取线程托管对象链表;
判断线程托管托管对象链表是否为空;
当若线程托管对象链表不为空,遍历线程托管对象链表,调用线程托管对象链表中插入的对象指针,并通过获取的对象指针释放对象,当线程托管对象链表遍历完毕,删除线程托管对象链表,执行结束。
相较于现有技术,程序员可以借助设置一个线程托管对象链表,对线程中的对象进行托管,通过托管,当线程结束时,自动释放被托管对象的一次引用。通过线程托管在主函数Main()方法里托管一个对象,当线程即将结束时自动释放一次引用,用户既不必担心线程运行期间对象的有效性,也不必费事地找时机释放对象。
此外,通过托管来管理对象的生命周期,会在线程结束时自动释放对象,用户就不必去检查每个线程的退出点,整个线程运行期间不必担心对象无效,也不用担心对象遗漏释放的情况,从而减轻用户的负担。
附图说明
图1是本发明线程托管对象的方法较佳实施例的主流程图。
图2是图1中步骤S30的细化流程图。
图3是图1中步骤S40的细化流程图。
具体实施方式
如图1所示,是本发明线程托管对象的方法较佳实施例的流程图。在本较佳实施例中,首先以如下构建的代码来进行说明:
用户定义的线程函数代码:
Figure GSB00001021907600031
用图1所示的流程描述上述构建的代码。
步骤S10:在主函数中创建一个线程。该线程运行用于执行用户定义的线程函数。具体而言,上述主函数的代码中,首先声明一个线程指针pThread,然后通过创建动作,即:CThread::New(&UserRoutine,0,NULL,&pThread),创建一个线程,该线程名称为UserRoutine。
步骤S20:执行线程的入口函数,在线程的入口函数中调用线程函数。入口函数的具体代码如下:
上述代码中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()函数代码如下:
Figure GSB00001021907600041
Figure GSB00001021907600051
用图2所示的流程描述上述构建的代码。
步骤S301,声明一个线程托管对象链表的类指针。具体而言,代码为CList*pList。
步骤S302,通过所述声明的类指针创建一个线程托管对象链表的类对象,实现一个线程托管对象链表。具体而言,代码为pList=newCList。
步骤S303,将线程函数中的对象指针插入到线程托管对象链表,即完成了托管线程函数中的对象。具体而言,代码为pList->Insert(pObject)。在本较佳实施例中,插入的线程托管对象指针为pFoo。
此外,由于线程函数的对象在第一次托管之后,线程托管对象链表已经存在,当线程函数需要多个对象被托管时,为保证每个线程中只有一个线程托管对象链表,可以直接将线程函数中对象指针插入到已经存在的线程托管对象链表中。具体做法为:判断线程托管对象链表是否为空,若不为空,直接将对象指针插入到线程托管对象链表中。具体而言,代码如下:
If(pList==NULL){
}
pList->Insert(pEntry,pUserData)。
如图3所示,是图1中步骤S40中调用线程托管对象链表中的对象指针的细化流程图。每个线程都有Thread Local Storage(TLS:线程本地存储)槽,占用一个TLS槽来保存一个线程托管对象链表,当线程即将结束的时候会自动检查这个链表,如果不为空则遍历它,并释放每个成员对象,从而实现线程托管对象链表的调用。在本较佳实施例中,调用线程托管对象链表代码如下:
Figure GSB00001021907600061
用图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 (3)

1.一种线程托管对象的方法,其特征在于,该方法包括如下步骤: 
步骤1,在主函数中创建一个线程; 
步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数; 
步骤3,声明一个线程托管对象链表的类指针,通过所述声明的类指针创建一个线程托管对象链表的类对象,实现一个线程托管对象链表,将线程函数中的对象指针插入到线程托管对象链表,即完成了托管线程函数中的对象;及 
步骤4,当线程函数执行完毕时,获取线程托管对象链表; 
判断线程托管对象链表是否为空; 
当若线程托管对象链表不为空,遍历线程托管对象链表,调用线程托管对象链表中插入的对象指针,并通过获取的对象指针释放对象,当线程托管对象链表遍历完毕,删除线程托管对象链表,执行结束。 
2.如权利要求1所述的线程托管对象的方法,其特征在于,所述线程托管对象链表存放在该线程的线程本地存储槽中。 
3.如权利要求1所述的线程托管对象的方法,其特征在于,所述遍历的方式为反向遍历。 
CN 200910049219 2009-04-14 2009-04-14 线程托管对象的方法 Expired - Fee Related CN101866298B (zh)

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 CN101866298A (zh) 2010-10-20
CN101866298B true 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 (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1325069A (zh) * 2000-05-15 2001-12-05 松下电器产业株式会社 应用执行装置及方法
CN1514354A (zh) * 2002-12-31 2004-07-21 ����̩ƽ 面向构件基于系统内核的进程池/线程池管理方法
CN1761949A (zh) * 2003-06-30 2006-04-19 松下电器产业株式会社 垃圾收集系统
CN1869939A (zh) * 2005-05-27 2006-11-29 华为技术有限公司 一种多线程应用程序访问数据库的方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1567250A (zh) * 2003-06-11 2005-01-19 中兴通讯股份有限公司 一种高速零碎片的小对象内存结构及分配方法
CN101271428A (zh) * 2008-02-25 2008-09-24 北京理工大学 一种对象数据存储管理的装置和方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1325069A (zh) * 2000-05-15 2001-12-05 松下电器产业株式会社 应用执行装置及方法
CN1514354A (zh) * 2002-12-31 2004-07-21 ����̩ƽ 面向构件基于系统内核的进程池/线程池管理方法
CN1761949A (zh) * 2003-06-30 2006-04-19 松下电器产业株式会社 垃圾收集系统
CN1869939A (zh) * 2005-05-27 2006-11-29 华为技术有限公司 一种多线程应用程序访问数据库的方法

Also Published As

Publication number Publication date
HK1148841A1 (en) 2011-09-16
CN101866298A (zh) 2010-10-20

Similar Documents

Publication Publication Date Title
CA2991131C (en) Method and architecture for providing database access control in a network with a distributed database system
US8145817B2 (en) Reader/writer lock with reduced cache contention
US20230333916A1 (en) Generic Concurrency Restriction
CN107092533A (zh) 基于ActiveMQ+Redis的同步消息队列
US20140019986A1 (en) Managing multi-threaded operations in a multimedia authoring environment
CN106528065B (zh) 一种线程获取方法及设备
CN102129391A (zh) 一种数据库中自旋锁的实现方法
US8132174B2 (en) Concurrency management in cluster computing of business applications
CN110032424B (zh) 分布式锁的实现方法和装置
CN111444002A (zh) 一种任务调度方法及装置
CN101866298B (zh) 线程托管对象的方法
CN104376086B (zh) 数据处理方法和装置
CN111708618A (zh) 一种基于Java多线程的处理方法和装置
CN108345505B (zh) 一种多线程资源管理方法和系统
CN101866300B (zh) 线程托管函数的方法
CN105843735B (zh) 一种终端内存的消耗方法及装置
CN110908968A (zh) 一种文件锁解锁时避免惊群的方法、装置、设备及存储介质
Jacobs Provably live exception handling
CN112052094A (zh) 一种基于多线程的任务执行方法
CN101788905A (zh) Applet托管对象的方法
Bouneb et al. A reduced maximality labeled transition system generation for recursive Petri nets
CN107463374B (zh) 一种基于继承和关联自动推演的子集模型抽取方法及系统
Soares et al. Concurrency manager
CN112822250B (zh) 一种大数据平台去中心化的调度和执行方法、装置
CN106293884A (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
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20130807

Termination date: 20160414