CN101866300A - 线程托管函数的方法 - Google Patents
线程托管函数的方法 Download PDFInfo
- Publication number
- CN101866300A CN101866300A CN200910049145A CN200910049145A CN101866300A CN 101866300 A CN101866300 A CN 101866300A CN 200910049145 A CN200910049145 A CN 200910049145A CN 200910049145 A CN200910049145 A CN 200910049145A CN 101866300 A CN101866300 A CN 101866300A
- Authority
- CN
- China
- Prior art keywords
- thread
- function
- depositing
- depositing function
- chained list
- 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
- Stored Programmes (AREA)
Abstract
一种线程托管函数的方法,该方法包括如下步骤:步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,在线程函数中注册线程托管函数;步骤4,当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。利用本发明可以减少程序的复杂度和耦合度,使程序中各个模块之间的关系简单和清晰。
Description
技术领域
本发明涉及一种托管函数的方法,尤其涉及一种线程托管函数的方法。
背景技术
在利用线程进行编程时,可能希望得到线程退出的通知,在线程即将结束退出的时刻做些资源清理的工作,或者当线程结束时需要设置一些标志、发送消息通知等等。
如果是一个结构简单的程序,可以确切地知道线程的出口,那么可以将清理工作放在线程出口点,但如果是一个复杂的线程,存在多个出口点,则维护起来比较麻烦。或者某个子函数,它可能被多个线程调用,又想在线程结束时做些处理(如:资源清理),就不容易预测线程出口点的位置。
发明内容
鉴于以上内容,有必要提供一种线程托管函数的方法,可以在线程结束这一特殊时刻被调用,减少程序的复杂度和耦合度,使程序中各个模块之间的关系简单和清晰。
一种线程托管函数的方法,该方法包括如下步骤:
步骤1,在主函数中创建一个线程;
步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;
步骤3,在线程函数中注册线程托管函数;及
步骤4,当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。
相较于现有技术,程序员可以借助设置一个或若干个线程托管函数,这些函数会在线程结束即将退出的时刻被调用,当线程执行到线程托管函数的代码时,会在当前线程上设置相应的记录,当线程退出用户代码,进入准备结束状态时,会自动调用先前托管的函数。如此一来,某个子模块的程序员也不必关心自己的模块会被哪个线程调用、调用线程的出口点在哪里,只要设置托管函数即可在线程结束的时刻得以执行预期的操作。线程托管函数减少程序的复杂度和耦合度,使代码和各个模块之间的关系更简单和清晰。
附图说明
图1是本发明线程托管函数的方法较佳实施例的主流程图。
图2是图1中步骤S30的细化流程图。
图3是图1中步骤S40的细化流程图。
具体实施方式
如图1所示,是本发明线程托管函数的方法较佳实施例的流程图。在本较佳实施例中,首先以如下构建的代码来进行说明:
用户定义的线程托管函数代码:
Void OnQuit(PVoid pUserData)//
{
Assert((Int32)pUserData==0x1234);//预期pUserData==0x1234,否则中assert
CThread::Sleep(1000,NULL);//使线程睡眠1秒钟
CConsole::WriteLine(“In OnQuit function...”);//打印到屏幕输出
}
用户定义的线程函数代码:
ECode UserRoutine(...)
{
CConsole::WriteLine(“Entered UserRoutine...”);//打印到屏幕输出
CThread::AtQuit(&OnQuit,(PVoid)0x1234);//向当前线程注册线程托管函数
CConsole::WriteLine(“Leaving UserRoutine...”);//打印到屏幕输出
ReturnNOERROR;//退出用户代码
}
主函数代码:
ECode ElastosMain(...)
{
IThread*pThread
CConsole::WriteLine(“Before CThread::New()”);//打印到屏幕输出
CThread::New(&UserRoutine,0,NULL,&pThread);//创建一个线程UserRoutine
pThread->Join(INFINITE,NULL);//等待线程结束
CConsole::WriteLine(“After Join()”);//打印到屏幕输出
return NOERROR_EXIT;//直接退出程序
}
用图1所示的流程描述上述构建的代码。
步骤S10:在主函数中创建一个线程。该线程运行用于执行用户定义的线程函数。具体而言,上述主函数的代码中,首先声明一个线程指针pThread,然后通过创建动作,即:CThread::New(&UserRoutine,0,NULL,&pThread)创建一个线程,该线程名称为UserRoutine。代码中的CConsole::WriteLine(“Before CThread::New()”)及CConsole::WriteLine(“After Join()”)是通过打印的方式查看代码是否执行。具体而言,若屏幕上显示出“After Join()”,则表明主函数Main()的代码中CConsole::WriteLine(“After Join()”)之前的代码已经执行完毕。
步骤S20:执行线程的入口函数,在线程的入口函数中调用线程函数。入口函数的具体代码如下:
ECode ThreadEntry(PVoid pParam)//线程的入口函数
{
ECode ec=(*pUserFunc)(pParam);
CleanupList();//清理线程托管函数链表
}。
上述代码中ECode ec=(*pUserFunc)(pParam)为调用用户实现的线程函数,其中pParam为参数,具体而言,在本较佳实施例中,所述调用的线程函数为UserRoutine()。
步骤S30:在线程函数中注册线程托管函数。上述用户定义的线程函数的代码中,通过调用CThread::AtQuit即可向当前线程注册托管函数,当线程结束时,会自动调用被托管的函数。
步骤S40:当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。
当上述步骤执行完毕时,屏幕输出如下:
Before CThread::New()
Entered UserRoutine...
Leaving UserRoutine...
In OnQuit function...
After Join()
上述线程托管函数主要目的在于当线程UserRoutine执行结束时,使当前线程睡眠1秒钟。
从屏幕输出可知,当线程函数UserRoutine()返回时,线程UserRoutine并没有立即结束,而是进入托管函数OnQuit()中,当OnQuit结束后,主函数ElastosMain中的Join才返回。
在本较佳实施例中,但不限于,以编程语言C的函数注册线程托管函数,在其他实施例中,用户也可以将一个其他编程语言如:C++的函数注册线程托管函数。
此外,用户也可以为一个线程注册多个线程托管函数,这些线程托管函数会在线程结束退出时按照注册顺序的相反顺序被调用执行。在本较佳实施例中,线程UserRoutine注册的线程托管函数为OnQuit(),当线程UserRoutine执行完毕时,调用线程托管函数OnQuit()。
如图2所示,是图1中步骤S30中在线程函数中注册线程托管函数的细化流程图。线程函数中注册线程托管函数是将线程函数需要调用的线程托管函数的指针插入到线程托管函数链表中。在本较佳实施例中,线程函数通过CThread::AtQuit注册线程托管函数,即通过函数AtQuit()进行注册。所述函数AtQuit()代码如下:
ECode CThread::AtQuit(
/*[in]*/PThreadQuitRoutine pEntry,
/*[in]*/PVoid pUserData)
CList*pList;
{
CThread::GetTlsObject(TLS_AutoCallList,&pList);//从TLS上获得线程托管函数链表指针
If(pList==NULL){
pList=new CList;//创建一个线程托管函数链表的类对象pList
CThread::SetTlsObject(TLS_AutoCallList,pList);//将pList保存在TLS上
}
pList->Insert(pEntry,pUserData);//向线程托管函数链表插入一个线程托管函数指针
return NOERROR;
}
用图2所示的流程描述上述构建的代码。
步骤S301,声明一个线程托管函数链表的类指针。具体而言,代码为CList*pList。
步骤S302,通过所述声明的类指针创建一个线程托管函数链表的类对象。具体而言,代码为pList=new CList。
步骤S303,将线程函数中的线程托管函数指针插入到线程托管函数链表的类对象中,实现一个线程托管函数链表,即完成了在线程函数中注册线程托管函数。具体而言,代码为pList->Insert(pEntry,pUserData)。在本较佳实施例中,插入的线程托管函数指针为线程UserRoutine注册的托管函数OnQuit()的指针。
此外,由于线程函数在第一次注册线程托管函数之后,线程托管函数链表已经存在,当线程函数注册多个线程托管函数时,为保证每个线程中只有一个线程托管函数链表,可以直接将线程托管函数指针插入到已经存在的线程托管函数链表中。具体做法为:判断线程托管函数链表是否为空,若不为空,直接将线程托管函数指针插入到线程托管函数链表中。具体而言,代码如下:
If(pList==NULL){
...
}
pList->Insert(pEntry,pUserData)。
如图3所示,是图1中步骤S40中调用注册的线程托管函数的细化流程图。每个线程都保存一个线程托管函数链表,当线程即将结束的时候会自动检查这个链表,如果不为空则遍历它,并释放每个成员对象,从而实现线程托管函数的调用。在本较佳实施例中,线程托管函数链表pList存放在该线程的一个Thread Local Storage(TLS:线程本地存储)槽中,在线程执行的时候,可以直接在该线程的TLS槽获取线程托管函数链表,在其它实施例中,也可以将线程托管函数链表存放于其它储存的区域。调用上述注册的线程托管函数的代码如下:
ECode CleanupList()
{
CThread::GetTlsObject(TLS_AutoCallList,&pList);
If(pList==NULL){
Return NOERROR;
}
PThreadQuitRoutine pEntry;
PVoid pUserData;
pHeader=pList;
pList=pList->Prev();
While(pList!=pHeader){//遍历线程托管函数链表,并调用线程托管函数
pList->GetCurrent(&pEntry,&pUserData);//获取线程托管函数链表当前节点的线程托管函数指针
pEntry(pUserData);//通过线程托管函数指针调用线程托管函数
pList=pList->Prev();//继续反向遍历线程托管函数链表
}
Delete pList;
}
用图3所示的流程描述上述构建的代码。
步骤S401,获取线程托管函数链表,即在线程函数的TLS槽中获取线程托管函数链表。具体代码为CThread::GetTlsObject(TLS_AutoCallList,&pList)。
步骤S402,判断线程托管函数链表是否为空。具体代码为If(pList==NULL)。
步骤S403,若线程托管函数链表不为空,则遍历线程托管函数链表,获取线程托管函数链表中的线程托管函数指针,并通过获取的线程托管函数指针调用该线程托管函数。在本较佳实施例中,所调用的线程托管函数为OnQuit(),使线程UserRoutine睡眠1秒钟。遍历的方式,但不限于,是反向遍历线程托管函数链表,即:按照倒序的方式依次读取线程托管函数链表中的数据,在其它实施例中,用户也可以通过正向遍历线程托管函数链表。
步骤S404,判断线程托管函数链表是否遍历完毕。
步骤S405,若线程托管函数链表遍历完毕,则删除线程托管函数链表,之后流程结束。具体代码为Delete pList。
在步骤S402中,若线程托管函数链表为空,则直接结束流程。具体代码为:
If(pList==NULL)
{
Return NOERROR;//直接退出
}
在步骤S404中,若线程托管函数链表没有遍历完毕,则转到步骤S403。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照以上较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。
Claims (6)
1.一种线程托管函数的方法,其特征在于,该方法包括如下步骤:
步骤1,在主函数中创建一个线程;
步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;
步骤3,在线程函数中注册线程托管函数;及
步骤4,当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。
2.如权利要求1所述的线程托管函数的方法,其特征在于,所述步骤3包括如下步骤:
声明一个线程托管函数链表的类指针;
通过所述声明的类指针创建一个线程托管函数链表的类对象;及
将线程函数中的线程托管函数指针插入到线程托管函数链表的类对象中,实现一个线程托管函数链表。
3.如权利要求2所述的线程托管函数的方法,其特征在于,所述线程托管函数链表包括线程托管函数指针。
4.如权利要求2所述的线程托管函数的方法,其特征在于,所述线程托管函数链表存放在该线程的线程本地存储槽中。
5.如权利要求2所述的线程托管函数的方法,其特征在于,所述步骤4包括如下步骤:
获取线程托管函数链表;
判断线程托管函数是否为空;
若线程托管函数链表不为空,遍历线程托管函数链表,获取线程托管函数链表中的线程托管函数指针,并通过获取的线程托管函数指针调用该线程托管函数;
当线程托管函数链表遍历完毕,删除线程托管函数链表;及
若该线程托管函数链表为空,则执行结束。
6.如权利要求5所述的线程托管函数的方法,其特征在于,所述遍历的方式为反向遍历。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200910049145 CN101866300B (zh) | 2009-04-14 | 2009-04-14 | 线程托管函数的方法 |
HK11102971.6A HK1148842A1 (en) | 2009-04-14 | 2011-03-24 | Method for depositing a function by a thread |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200910049145 CN101866300B (zh) | 2009-04-14 | 2009-04-14 | 线程托管函数的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101866300A true CN101866300A (zh) | 2010-10-20 |
CN101866300B CN101866300B (zh) | 2013-08-07 |
Family
ID=42958034
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200910049145 Expired - Fee Related CN101866300B (zh) | 2009-04-14 | 2009-04-14 | 线程托管函数的方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN101866300B (zh) |
HK (1) | HK1148842A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102609308A (zh) * | 2011-12-22 | 2012-07-25 | 深圳市万兴软件有限公司 | 一种非主线程失效方法及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1514354A (zh) * | 2002-12-31 | 2004-07-21 | ����̩ƽ | 面向构件基于系统内核的进程池/线程池管理方法 |
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100495334C (zh) * | 2003-01-22 | 2009-06-03 | 上海科泰世纪科技有限公司 | 一种基于工作例程/主导例程运行线程/进程的方法 |
CN1288557C (zh) * | 2003-06-25 | 2006-12-06 | 英业达股份有限公司 | 多执行线程同时停止的方法 |
US7823021B2 (en) * | 2005-05-26 | 2010-10-26 | United Parcel Service Of America, Inc. | Software process monitor |
CN100543675C (zh) * | 2007-12-26 | 2009-09-23 | 上海科泰世纪科技有限公司 | 计算机软件系统中基于构件接口实现事件回调的方法 |
-
2009
- 2009-04-14 CN CN 200910049145 patent/CN101866300B/zh not_active Expired - Fee Related
-
2011
- 2011-03-24 HK HK11102971.6A patent/HK1148842A1/xx not_active IP Right Cessation
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1514354A (zh) * | 2002-12-31 | 2004-07-21 | ����̩ƽ | 面向构件基于系统内核的进程池/线程池管理方法 |
CN1728106A (zh) * | 2004-07-26 | 2006-02-01 | 中兴通讯股份有限公司 | 一种应用程序故障的定位方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102609308A (zh) * | 2011-12-22 | 2012-07-25 | 深圳市万兴软件有限公司 | 一种非主线程失效方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
HK1148842A1 (en) | 2011-09-16 |
CN101866300B (zh) | 2013-08-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7676791B2 (en) | Implementation of concurrent programs in object-oriented languages | |
JP5516398B2 (ja) | マルチプロセッサシステム、マルチプロセッサシステムのos間デバイス共有方法 | |
CN103065221A (zh) | 基于bpel的多学科协同优化流程建模与调度的方法和系统 | |
CN108595282A (zh) | 一种高并发消息队列的实现方法 | |
KR20080005523A (ko) | 동시성 도메인들과의 멀티 쓰레딩 | |
CN107491346A (zh) | 一种应用的任务处理方法、装置及系统 | |
CN106648674A (zh) | 一种大数据计算管理方法及系统 | |
CN103995778A (zh) | 一种基于事件和动作的脚本文件生成方法及其装置 | |
CN106528065B (zh) | 一种线程获取方法及设备 | |
CN115629737A (zh) | 流程编排引擎的实现方法和流程编排引擎系统 | |
CN101866300B (zh) | 线程托管函数的方法 | |
CN107515792A (zh) | 功能类使用Handler进行消息处理的方法和装置 | |
CN101216780A (zh) | 在对称多处理体系下实现多实例线程通信的方法及装置 | |
WO2016201964A1 (zh) | 一种实现测试用例构建的方法及装置 | |
CN104253807B (zh) | 一种媒体资源控制方法及装置 | |
Fidge | A comparative introduction to CSP, CCS and LOTOS | |
Palamidessi et al. | A randomized encoding of the π-calculus with mixed choice | |
CN105187519B (zh) | 一种基于AIO的socket传输系统 | |
US10768902B2 (en) | Actor model programming | |
CN101826004A (zh) | Applet托管函数的方法 | |
US20230066881A1 (en) | Information flow-based decision-making and scheduling customization method and apparatus | |
Klein et al. | Hierarchical modeling and formal verification. An industrial case study using Reo and Vereofy | |
US20030204551A1 (en) | System and method for providing media processing services | |
Joung | The congenial talking philosophers problem in computer networks | |
CN105843735B (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: 1148842 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: 1148842 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 |