一种自定义的多线程管控的通信方法
【专利摘要】一种自定义的多线程管控的通信方法,包括如下步骤:1)针对子线程的入口函数设计一个参数结构对象,其内嵌业务参数和两个命令指针单项;内嵌业务参数是正常的业务设计功能所需要的,命令指针单项是为父子线程之间的控制管理所设计;2)在父线程中定义、初始化2个局部变量,其地址作为上行、下行命令参数指针,启动子线程;3)在父线程中改变局部变量取值,所述局部变量包括下行命令参数,该取值变动引起子线程执行逻辑的变动;4)在子线程中获取传入指针,改变上行命令参数的取值,该取值变动引起父线程中代码执行逻辑的变动。本发明减少内核资源消耗、代码封装较简约、实时性良好。
【专利说明】
一种自定义的多线程管控的通信方法
技术领域
[0001] 本发明属于程序通信方法,尤其涉及一种多线程管控的通信方法。
【背景技术】
[0002] 多线程编程是Windows/Linux/vxWorks等多种操作系统普遍支持的一种软件设计 方法,也是C/C++、Java、C#等多种开发语言平台支持的设计方法。在C/C++层面各类操作系 统上进行线程之间的管理控制、数据通信,都有类似的概念和方式,例如互斥、加锁、同步和 等待等。在JAVA由于语言级的多线程API支持,多线程设计变得更为简单,JAVA多线程控制 管理的粒度较C/C++更粗,因而灵活性不比后者。
[0003]在各类操作系统上,使用C/C++进行多线程程序设计的线程管控方法,尤其是两个 父子线程间进行不同代码段的同步。通常使用锁机制、信号灯来实现,在windows上还可以 使用消息进行代码执行流的切换和控制。但这些机制一般使用内核对象、外部变量,在资源 消耗、代码封装上不够简约;windows的消息机制是非实时的,有时候会导致过于长的时间 延时。
【发明内容】
[0004] 为了克服已有多线程管控的通信方法的内核资源消耗较大、代码封装不简约、实 时性较差的不足,本发明提供了一种减少内核资源消耗、代码封装较简约、实时性良好的自 定义的多线程管控的通信方法。
[0005] 本发明解决其技术问题所采用的技术方案是:
[0006] -种自定义的多线程管控的通信方法,该通信方法包括如下步骤:
[0007] 1)针对子线程的入口函数设计一个参数结构对象,其内嵌业务参数和两个命令指 针单项;内嵌业务参数是正常的业务设计功能所需要的,命令指针单项是为父子线程之间 的控制管理所设计;
[0008] 2)在父线程中定义、初始化2个局部变量,其地址作为上行、下行命令参数指针,启 动子线程;
[0009] 3)在父线程中改变局部变量取值,所述局部变量包括下行命令参数,该取值变动 引起子线程执行逻辑的变动;
[0010] 4)在子线程中获取传入指针,改变上行命令参数的取值,该取值变动引起父线程 中代码执行逻辑的变动。
[0011] 进一步,所述步骤3)、4)视实际代码设计需要,重复地、交替不规则进行。
[0012] 再进一步,步骤3)、4)中,分别在执行对方线程的命令切换引起的代码段之前,预 先把参数命令改回初始值。
[0013] 更进一步,在线程内通过改变命令值进行对另一线程的控制之前,检查当前命令 参数是否为初始值,是初始值才进行命令的改值,否则认为前一次对命令的改值,还没有引 起线程执行流向的变动。
[0014] 本发明的技术构思为:设计了一种基于命令参数的线程代码切换控制技术,该方 法适合于Windows/Linux/vxWorks等多种操作系统并在C/C++层面实现。
[0015] 利用线程函数的输入参数中内置指针形式的命令参数,父线程在启动子线程后可 以设置命令取值,子线程根据命令执行不同的代码段;子线程也可以设置不同的命令参数 值对父线程的代码段执行流向进行控制。其实质实际是利用了 C/C++语言中函数的指针参 数所具有的承载输入输出所兼备的性质。
[0016] 相对于现有的一般程序员拘泥于现成的多线程编程技术,而本方法异于现成的多 线程同步编程机制;从系统资源消耗上,本方法使用的技术占用资源低,是轻量级方法;与 WINDOWS消息机制相比,本方法实时性好,延时低;本方法基于函数之间的参数指针实现,不 涉及定义外部、或全局变量,代码封装性比较好。
[0017] 本发明的有益效果主要表现在:减少内核资源消耗、代码封装较简约、实时性良 好。
【附图说明】
[0018] 图1是自定义的多线程管控的通信方法的原理图。
【具体实施方式】
[0019] 下面结合附图对本发明作进一步描述。
[0020] 参照图1,一种自定义的多线程管控的通信方法,包括如下步骤:
[0021] 1)针对子线程的入口函数设计一个参数结构对象,其内嵌业务参数和两个命令指 针单项;前者是正常的业务设计功能所需要的,后者是为父子线程之间的控制管理所设计;
[0022] Typedef struct
[0023] {
[0024] Char*downcmd; //下行控制参数,用于父线程控制子线程
[0025] Char*Upcmd; //上行控制参数,用于子线程控制父线程
[0026] Struct*SunfforkPara;
[0027] }SUN_THREAD_PARA;
[0028] 例如,SunWorkPara是原业务所需的子线程传入参数,
[0029] downcmd/upcmd是字符型的命令参数,它们合成为新的子线程函数
[0030]参数。
[0031] 2)在父线程中定义、初始化2个局部变量,其地址作为上行、下行命令参数指针,启 动子线程;
[0032] 3)在父线程中改变(下行命令参数)局部变量取值,该取值变动引起子线程执行逻 辑的变动;
[0033] 4)在子线程中获取传入指针,改变上行命令参数的取值,该取值变动引起父线程 中代码执行逻辑的变动。
[0034] 所述步骤3)、4)视实际代码设计需要,可以重复地、交替不规则进行。
[0035] 所述步骤3)、4)中,分别在执行对方线程的命令切换引起的代码段之前,预先把参 数命令改回初始值。
[0036] 在线程内通过改变命令值进行对另一线程的控制之前,检查当前命令参数是否为 初始值,是初始值才进行命令的改值,否则认为前一次对命令的改值,还没有引起线程执行 流向的变动。
[0037] 实例:一个用C伪代码实现的方法原型,这里子线程为长期驻留内存的线程,其中, 父线程代码 7'ypedef struct ! Char * downcmd; Char ^ upcmd,
[0038] Struct * SunWorkPara; } SUN _TH READ PARA; Vo id fa t he r_t h read_fu nc () { Char dcommaiid="_";//命令参数初始化 Char uG:COTiraand="_";//命令参数初始化 SunWdrkPara work_para; ... ...//工作参数的初始化 SIM_THREAD_PARA sun_para; Sun_para.dovvnLmd - & dcommand: sun」)ara.upcnid = & ucommand; sun_para. SunWorkPara = & workjpara; //启动子线程 sHandle=CreatThread( sun tliread func. &sun_para);
[0039] If(dcoinmaiid=''j')deommaiid=s'a";//切换之前检查命令值是否为 初始值 if (tico'mmaiid=="z") { ucom廳 nd 二 //执厅子线程命令的代码r } rf(dcoi?!iand 二="_'')dcoimnand 二" b";//命令子线 f1!丨结束 WaitfbrsignWeObject(sHancile,INFINITE);//等待子线程结束 } 子线程代码 Static int sun_thread_func(void * para) { SUN_THREAD_PARA * sunpara = (SUN_THREAD_PARA *)para; Char * dcommand = sunpara->downcmd; Char * ucommand = sunpara->upcmdj While⑴//长期驻留内存
[0040] { If(*dcommand二 J'b")break; If(*dcomiTiaiid=二" a") { *<fcommand="_";//执行命令之前预先把命令改回初始值 //执行父线程命令的代码段 } _11'(*110〇〇1^11<1=;二"_")'*11€;_〇:_〇1!1捣11<1:="2";//控制父线程执行的代码段; }
【主权项】
1. 一种自定义的多线程管控的通信方法,其特征在于:该通信方法包括如下步骤: 1) 针对子线程的入口函数设计一个参数结构对象,其内嵌业务参数和两个命令指针单 项;内嵌业务参数是正常的业务设计功能所需要的,命令指针单项是为父子线程之间的控 制管理所设计; 2) 在父线程中定义、初始化2个局部变量,其地址作为上行、下行命令参数指针,启动子 线程; 3) 在父线程中改变局部变量取值,所述局部变量包括下行命令参数,该取值变动引起 子线程执行逻辑的变动; 4) 在子线程中获取传入指针,改变上行命令参数的取值,该取值变动引起父线程中代 码执行逻辑的变动。2. 如权利要求1所述的一种自定义的多线程管控的通信方法,其特征在于:所述步骤 3) 、4)视实际代码设计需要,重复地、交替不规则进行。3. 如权利要求1或2所述的一种自定义的多线程管控的通信方法,其特征在于:步骤3)、 4) 中,分别在执行对方线程的命令切换引起的代码段之前,预先把参数命令改回初始值。4. 如权利要求1或2所述的一种自定义的多线程管控的通信方法,其特征在于:在线程 内通过改变命令值进行对另一线程的控制之前,检查当前命令参数是否为初始值,是初始 值才进行命令的改值,否则认为前一次对命令的改值,还没有引起线程执行流向的变动。
【文档编号】G06F9/54GK105930219SQ201610261157
【公开日】2016年9月7日
【申请日】2016年4月22日
【发明人】陆成刚, 徐利光, 王定江
【申请人】浙江工业大学