一种线程托管函数的方法,该方法包括如下步骤:步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,在线程函数中注册线程托管函数;步骤4,当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。利用本发明专利技术可以减少程序的复杂度和耦合度,使程序中各个模块之间的关系简单和清晰。
【技术实现步骤摘要】
本专利技术涉及一种托管函数的方法,尤其涉及一种。
技术介绍
在利用线程进行编程时,可能希望得到线程退出的通知,在线程即将结束退出的 时刻做些资源清理的工作,或者当线程结束时需要设置一些标志、发送消息通知等等。如果是一个结构简单的程序,可以确切地知道线程的出口,那么可以将清理工作 放在线程出口点,但如果是一个复杂的线程,存在多个出口点,则维护起来比较麻烦。或者 某个子函数,它可能被多个线程调用,又想在线程结束时做些处理(如资源清理),就不容 易预测线程出口点的位置。
技术实现思路
鉴于以上内容,有必要提供一种,可以在线程结束这一特殊 时刻被调用,减少程序的复杂度和耦合度,使程序中各个模块之间的关系简单和清晰。一种,该方法包括如下步骤步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,在线程函数中注册线程托管函数 ’及步骤4,当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。相较于现有技术,程序员可以借助设置一个或若干个线程托管函数,这些函数会 在线程结束即将退出的时刻被调用,当线程执行到线程托管函数的代码时,会在当前线程 上设置相应的记录,当线程退出用户代码,进入准备结束状态时,会自动调用先前托管的函 数。如此一来,某个子模块的程序员也不必关心自己的模块会被哪个线程调用、调用线程的 出口点在哪里,只要设置托管函数即可在线程结束的时刻得以执行预期的操作。线程托管 函数减少程序的复杂度和耦合度,使代码和各个模块之间的关系更简单和清晰。附图说明图1是本专利技术较佳实施例的主流程图。图2是图1中步骤S30的细化流程图。图3是图1中步骤S40的细化流程图。具体实施例方式如图1所示,是本专利技术较佳实施例的流程图。在本较佳实施 例中,首先以如下构建的代码来进行说明用户定义的线程托管函数代码Void OnQuit(PVoid pUserData)//3{Assert ((Int32) pUserData = = 0x1234) ;// 预期 pUserData = = 0x1234,否则 中 assertCThread: Sleep (1000, NULL) ;// 使线程睡眠 1 秒钟CConsole: :WriteLine( "In OnQuit function. ”);// 打印到屏幕输出}用户定义的线程函数代码ECode UserRoutine (…){CConsole: :WriteLine( "Entered UserRoutine. ”);// 打印到屏幕输出CThread: AtQuit (&0nQuit, (PVoid) 0x1234) ;//向当前线程注册线程托管函数CConsole: :WriteLine( "Leaving UserRoutine. ”);// 打印到屏幕输出ReturnNOERROR;//退出用户代码}主函数代码ECode ElastosMain (…){IThread氺pThreadCConsole: :WriteLine( "Before CThread: :New (),,);//打印到屏幕输出CThread::New(&UserRoutine,0, NULL, &pThread) ;// 创建一个线程 UserRoutinepThread- > Join (INFINITE, NULL) ;// 等待线程结束CConsole: :WriteLine( "After Join()”);//打印到屏幕输出return N0ERR0R_EXIT ;//直接退出程序}用图1所示的流程描述上述构建的代码。步骤S10:在主函数中创建一个线程。该线程运行用于执行用户定义的线程 函数。具体而言,上述主函数的代码中,首先声明一个线程指针pThread,然后通过创 建动作,艮p CThread: :New(&UserRoutine,0, NULL, &pThread)创建一个线程,该线程 名称为 UserRoutine。代码中的 CConsole: :WriteLine( "Before CThread: :New() ”) 及CConsole: :WriteLine( "After Join(),,)是通过打印的方式查看代码是否执 行。具体而言,若屏幕上显示出‘‘After JoinO”,则表明主函数MainO的代码中 CConsole: :WriteLine( "After JoinO”)之前的代码已经执行完毕。步骤S20 执行线程的入口函数,在线程的入口函数中调用线程函数。入口函数的 具体代码如下ECode ThreadEntry (PVoid pParam)//线程的入 口函数{ECode ec =(氺pUserFunc) (pParam);CleanupListQ ;//清理线程托管函数链表4}。上述代码中ECode ec = (*pUserFunc) (pParam)为调用用户实现的线程函数,其 中pParam为参数,具体而言,在本较佳实施例中,所述调用的线程函数为UserRoutineO。步骤S30 在线程函数中注册线程托管函数。上述用户定义的线程函数的代码中, 通过调用CThread::AtQuit即可向当前线程注册托管函数,当线程结束时,会自动调用被 托管的函数。步骤S40 当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。当上述步骤执行完毕时,屏幕输出如下Before CThread: :New()Entered UserRoutine...Leaving UserRoutine...In OnQuit function...After Join()上述线程托管函数主要目的在于当线程UserRoutine执行结束时,使当前线程睡 眠1秒钟。从屏幕输出可知,当线程函数UserRoutineO返回时,线程UserRoutine并没有立 即结束,而是进入托管函数OnQuit ()中,当OnQuit结束后,主函数ElastosMain中的Join 才返回。在本较佳实施例中,但不限于,以编程语言C的函数注册线程托管函数,在其他实 施例中,用户也可以将一个其他编程语言如C++的函数注册线程托管函数。此外,用户也可以为一个线程注册多个线程托管函数,这些线程托管函数会在线 程结束退出时按照注册顺序的相反顺序被调用执行。在本较佳实施例中,线程UserRoutine 注册的线程托管函数为OnQuit (),当线程UserRoutine执行完毕时,调用线程托管函数 OnQuit ()。如图2所示,是图1中步骤S30中在线程函数中注册线程托管函数的细化流程图。 线程函数中注册线程托管函数是将线程函数需要调用的线程托管函数的指针插入到线程 托管函数链表中。在本较佳实施例中,线程函数通过CThread: AtQuit注册线程托管函数, 即通过函数AtQuitO进行注册。所述函数AtQuit ()代码如下ECode CThread:AtQuit(*/PThreadQuitRoutine pEntry,/氺氺/PVoid pUserData)CList*pList ;{CThre本文档来自技高网...
【技术保护点】
一种线程托管函数的方法,其特征在于,该方法包括如下步骤:步骤1,在主函数中创建一个线程;步骤2,执行线程的入口函数,在线程的入口函数中调用线程函数;步骤3,在线程函数中注册线程托管函数;及步骤4,当线程函数执行完毕时,调用上述注册的线程托管函数,执行结束。
【技术特征摘要】
【专利技术属性】
技术研发人员:宋世军,陈榕,
申请(专利权)人:上海科泰世纪科技有限公司,
类型:发明
国别省市:31[中国|上海]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。