一种基于LINUX的多线程硬实时控制方法.pdf

上传人:1*** 文档编号:5778945 上传时间:2019-03-18 格式:PDF 页数:9 大小:722.83KB
返回 下载 相关 举报
摘要
申请专利号:

CN201310273174.0

申请日:

2013.07.02

公开号:

CN103345422A

公开日:

2013.10.09

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 9/46申请日:20130702|||公开

IPC分类号:

G06F9/46

主分类号:

G06F9/46

申请人:

厦门雅迅网络股份有限公司

发明人:

陈华云; 郑振贵; 刘伟峰; 郑福弟

地址:

361000 福建省厦门市软件园二期观日路46号

优先权:

专利代理机构:

厦门市诚得知识产权代理事务所(普通合伙) 35209

代理人:

李伊飏

PDF下载: PDF下载
内容摘要

本发明公开一种基于Linux的多线程硬实时控制方法,包括以下步骤:步骤1:定义全局互斥锁并初始化;步骤2:创建主控线程和被控线程;步骤3:在主控线程中申请互斥锁,在被控线程中进行信号注册;步骤4:对主控线程进行实时监控,检测其是否需要实时挂起被控线程,如果是,则转至步骤5;如果否,则检测其是否需要恢复被控线程,如果是,则转到步骤6,如果否,则循环执行步骤4;步骤5:主控线程执行挂起被控线程的操作,返回步骤4;步骤6:主控线程恢复被控线程;步骤7:主控线程再次申请互斥锁,并转到步骤4。本发明运用信号传递的高优先级和互斥锁的性质,达到了非常实时的挂起被控线程和恢复被控线程的目的,达到了硬实时的要求。

权利要求书

权利要求书
1.  一种基于Linux的多线程硬实时控制方法,其特征在于:包括以下过程:
过程1:定义一个全局的互斥锁,并在主线程中申请互斥锁;在被控线程中注册信号,并定义信号处理函数,该信号处理函数用以申请全局的互斥锁;
过程2:当主线程要挂起被控线程时,向被控线程发送信号,被控线程接收到信号后,被阻塞挂起;
过程3:当主线程要恢复被控线程时,释放掉互斥锁,则被控线程就可以获取到互斥锁,解除阻塞,被控线程恢复运行。

2.  根据权利要求1所述的基于Linux的多线程硬实时控制方法,其特征在于:该方法具体包括以下步骤:
步骤1:定义全局的互斥锁,并初始化该互斥锁;
步骤2:创建一主控线程以及1个或多个被控线程;
步骤3:在主控线程中申请互斥锁,在被控线程中进行信号注册,并定义相应的接收信号类型和接收信号处理函数,不同的被控线程对应不同的接收信号类型,接收信号处理函数对不同的接收信号类型进行处理;
步骤4:对主控线程进行实时监控,检测其是否需要实时挂起1个或多个被控线程,如果是,则转至步骤5;如果否,则检测其是否需要恢复被控线程使其继续运行,如果是,则转到步骤6,如果否,则循环执行该步骤4;
步骤5:主控线程执行挂起被控线程的操作:主控线程向待被挂起的被控线程发送步骤3定义的信号;被控线程接收到该信号,执行相应的接收信号处理函数,将该被控线程挂起;返回步骤4;
步骤6:主控线程恢复被控线程,使其继续运行:主控线程释放之前申请到的互斥锁;则此时互斥锁处于可被申请状态,立即唤醒被控线程,被控线程成功申请到互斥锁,则继续运行;被控线程申请到互斥锁后立即释放掉,并继续运行,等待下一次的信号到来;
步骤7:主控线程再次申请互斥锁,并转到步骤4。

3.  根据权利要求1所述的基于Linux的多线程硬实时控制方法,其特征在于:所述步骤1中,全局的互斥锁可以为1个或者多个。

4.  根据权利要求1所述的基于Linux的多线程硬实时控制方法,其特征在于:如果被控线程为多个,则步骤3具体是:在主控线程中申请互斥锁,在被控线程中进行信号注册,并定义共同的接收信号类型和接收信号处理函数,不同的被控线程对应相同的接收信号类型,接收信号处理函数对该接收信号类型进行处理;
步骤5中,主控线程A向待被挂起的被控线程发送步骤3定义的接收信号类型,具体是:主控线程A向本进程发送步骤3定义的接收信号类型,以广播的形式通知该进程的各个线程。

5.  根据权利要求4所述的基于Linux的多线程硬实时控制方法,其特征在于:步骤5中,主控线程A向待被挂起的被控线程发送步骤3定义的接收信号类型,具体是:被控线程在同一个互斥锁上面叠加等待,主控线程A按先后顺序向各个被控线程分别发送信号;当主控线程要恢复被控线程时,释放掉互斥锁,等待在互斥锁上面的各个被控线程按顺序相继唤醒。

说明书

说明书一种基于Linux的多线程硬实时控制方法
技术领域
本发明涉及多线程处理,尤其涉及基于Linux的多线程的硬实时控制方法。
背景技术
现有的Linux系统开发中,基本都会用到多线程的开发技术。而且多线程中要进行相互的控制。
当前的一般线程控制方法有:a、通过使用全局变量。A线程循环判断变量的当前值来切换状态,B线程中修改变量值来控制A线程。这样做资源浪费并且无法实时控制。b、使用条件变量。使用条件变量的线程可实现线程的唤醒,而无法在外部对线程进行实时的挂起,挂起只能线程本身运行到挂起点后才可以。因此只实现线程同步,而没有线程实时控制。上述现有的方法无法做到对线程的实时控制。
另一方面,在编程中,为了保证共享数据操作的完整性,引入了对象互斥锁的概念。每个对象都对应于一个可称为"互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。例如申请号为200310114380.3的发明专利,公开了一种用于串行互斥体的方法与装置,其将互斥锁与共享数据项相关联、并向多个执行线程提供互斥锁所有权的机制,这些线程按次序对共享数据项执行代码操作。该方法主要是使用互斥锁来保证共享数据的一致性。其中使用到了互斥锁,用互斥锁主要是对共享资源的保护,让多线程不能同时访问共享资源,而是排着队顺序去访问的。再例如申请号为201010182624.1的发明专利,公开了一种资源共享的方法及系统,其提供了一种资源共享的方法和系统,所述方法包括下述步骤:设置资源与文件中的字节之间的对应关系;当进程访问资源时,针对文件中与该资源对应的字节申请文件锁,并在文件锁申请成功后,进程按照申请的文件锁访问资源;当进程释放资源时,解除进程针对文件中该资源对应的字节申请的文件锁。其主要也是使用互斥锁对共享资源的互斥访问。其中使用到了互斥锁,用互斥锁主要是对共享资源的保护,让多线程不能同时访问共享资源。
发明内容
因此,针对上述的问题,本发明提出一种基于Linux的多线程硬实时控制方法,使用互斥锁和信号结合控制,达到对线程的硬实时控制的目的。
为了解决上述技术问题,本发明所采用的思路是使用互斥锁和信号结合控制。其中,使用互斥锁,但不是使用它来对临界资源的控制保护这一基本功能,而是用到了一个线程在该互斥锁上面等待跟获取的实时性,进而达到线程的实时挂起跟恢复运行。使用信号,信号的发送跟接收是使用中断方式的,所以具有较高的优先级,使用信号可以随时并实时的通知被控制线程,使之挂起,达到硬实时控制的目的。
具体的,本发明所采用的技术方案为,一种基于Linux的多线程硬实时控制方法,包括以下过程: 
过程1:定义一个全局的互斥锁,并在主线程中申请互斥锁;在被控线程中注册信号,并定义信号处理函数,该信号处理函数用以申请全局的互斥锁;
过程2:当主线程要挂起被控线程时,向被控线程发送信号,被控线程接收到信号后,被阻塞挂起;
过程3:当主线程要恢复被控线程时,释放掉互斥锁,则被控线程就可以获取到互斥锁,解除阻塞,被控线程恢复运行。
其具体的实现步骤如下:
步骤1:定义一个全局的互斥锁,并初始化该互斥锁;
步骤2:创建一主控线程以及1个或多个被控线程; 
步骤3:在主控线程中申请互斥锁,在被控线程中进行信号注册,并定义相应的接收信号类型和接收信号处理函数,不同的被控线程对应不同的接收信号类型,接收信号处理函数对不同的接收信号类型进行处理; 
步骤4:对主控线程进行实时监控,检测其是否需要实时挂起1个或多个被控线程,如果是,则转至步骤5;如果否,则检测其是否需要恢复被控线程使其继续运行,如果是,则转到步骤6,如果否,则循环执行该步骤4; 
步骤5:主控线程执行挂起被控线程的操作:主控线程向待被挂起的被控线程发送步骤3定义的接收信号类型;被控线程接收到该接收信号类型,执行相应的接收信号处理函数,将该被控线程挂起;返回步骤4;其中,接收信号处理函数首先对互斥锁执行申请操作,由于互斥锁已经被主控线程申请了,所以被控线程申请不到互斥锁,只能挂起等待;
步骤6:主控线程恢复被控线程,使其继续运行:主控线程释放掉之前申请到的互斥锁;则此时互斥锁处于可被申请状态,立即唤醒被控线程,被控线程成功申请到互斥锁,则继续运行;被控线程申请到互斥锁后立即释放掉,并继续运行,等待下一次的信号到来,即继续等待主控线程发送的接收信号类型; 
步骤7:主控线程再次申请互斥锁,并转到步骤4。
上述步骤中,步骤5是施行实时挂起被控线程的操作,使用了信号传递的高优先级和互斥锁的性质,达到了非常实时的挂起线程的目的,达到了硬实时的要求。步骤6是恢复被控线程运行的操作,由于互斥锁的自动唤醒机制,也达到了实时恢复线程运行的目的。
本发明通过上述方案,使用了信号传递的高优先级和互斥锁的性质,达到了非常实时的挂起被控线程和恢复被控线程的目的,达到了硬实时的要求。本发明使用到了互斥锁,不是使用互斥锁来对临界资源的控制保护这一基本功能,或者使用互斥锁来保护共享资源,而是用到了一个线程在该互斥锁上面等待跟获取的实时性(因为其不能被多个线程同时申请到的属性),该互斥锁与信号配合来达到线程实时控制的目的,进而达到线程的实时挂起跟恢复运行。本方案不涉及对共享资源的访问,而是多线程中的相互控制,只是线程对线程的控制,而且是实时的控制。同时,本发明超越了现有使用全局变量来循环判断变量的当前值来切换线程的运行状态所带来的不实时性;也超越了使用条件变量方法无法做到从外部控制线程的问题。使对线程的控制达到了随时随地并且硬实时的控制高度。 
附图说明
图1为本发明的流程图。
具体实施方式
现结合附图和具体实施方式对本发明进一步说明。
本发明提出一种基于Linux的多线程硬实时控制方法,使用互斥锁和信号结合控制,达到对线程的硬实时控制的目的。本发明的方法包括以下过程,首先,定义一个全局的互斥锁,并在主线程中申请互斥锁;在被控线程中注册信号,并定义信号处理函数,信号处理函数用以申请全局的互斥锁;其次,当主线程要挂起被控线程的时候,向被控线程发送信号,被控线程接收到信号后,立即尝试去申请互斥锁,此时互斥锁已经被主线程申请了,所以被控线程就申请不到,只能被阻塞挂起,从而达到了实时挂起线程的目的;再次,当主线程想要恢复被控线程时,只需把互斥锁释放掉就可以了;此时被控线程就可以获取到互斥锁,并解除阻塞,从而达到了恢复被控线程的目的。
实施例1
参照图1,本发明的方案的具体实施步骤如下: 
步骤1:定义一个全局的互斥锁,并初始化该互斥锁;
步骤2:创建主控线程和被控线程,1个主控线程可同时控制1个或多个被控线程,本实施例中,主控线程和被控线程均为1个,记为主控线程A和被控线程B; 
步骤3:在主控线程A中申请互斥锁;在被控线程B中进行信号注册,并定义相应的接收信号类型、接收信号处理函数;其中,所谓的“信号注册”,主要是指对某一线程注册一个信号,让该线程以后可以接收到这个信号。至于注册哪一种信号,也就是“信号类型”,这个一般使用系统提供给用户自定义使用的“SIGUSR1”、“SIGUSR2”等信号。“接收信号处理函数”指的是当该线程接收到这个信号后,要去做什么,本方案中的“接收信号处理函数”是去申请互斥锁;
步骤4:对主控线程进行实时监控,检测其是否需要实时挂起 1个或多个被控线程,如果是,则转至步骤5;如果否,则检测其是否需要恢复被控线程使其继续运行,如果是,则转到步骤6,如果否,则循环执行该步骤4;其中,需不需要挂起被控线程,何时挂起或回复被控线程,这个是由主控线程自己决定。他可以在自身到达某个状态后挂起被控线程、或者接到某种事件后挂起被控线程,到底何时挂起这个得看具体程序的功能需要了。本发明的方案是可以做到随时随地的控制被控线程的,所以不论主控线程想要什么时候挂起或恢复被控线程都没有关系;
步骤5:主控线程A挂起被控线程B:首先主控线程A向待被挂起的被控线程B发送步骤3中定义的信号;被控线程B接收到该信号,执行相应的信号处理函数;信号处理函数首先对互斥锁执行申请操作,由于互斥锁已经被主控线程A申请了,所以被控线程B申请不到互斥锁,只能挂起等待;返回步骤4;
步骤6:主控线程A恢复被控线程B,使其继续运行:主控线程A释放掉之前申请到的互斥锁;则此时互斥锁处于可被申请状态,立即唤醒被控线程B,被控线程B成功申请到互斥锁,并继续运行;被控线程B申请到互斥锁后立即释放掉,并继续运行,等待下一次的信号到来;
步骤7:主控线程A再次申请互斥锁,并转到步骤4。
本方案中的步骤5是施行实时挂起被控线程B的操作,使用了信号传递的高优先级和互斥锁的性质,达到了非常实时的挂起线程的目的,达到了硬实时的要求。步骤6是恢复被控线程B运行的操作,由于互斥锁的自动唤醒机制,也达到了实时恢复线程运行的目的。
实施例2
步骤1:定义一个全局的互斥锁,并初始化该互斥锁;
步骤2:创建主控线程和被控线程,1个主控线程可同时控制1个或多个被控线程,本实施例中,主控线程为1个,记为主控线程A;被控线程均为N个,记为被控线程B1、…、被控线程BN,N≥2;主控线程A控制N个被控线程,则需要将每个被控线程注册为不同的信号类型,同时各个被控线程使用各自的互斥锁,这样子才能更清楚、更精确的控制。可以做到分开的控制不同的线程挂起或恢复,也可以同时对多个线程进行挂起或恢复;
步骤3:在主控线程A中申请互斥锁,在被控线程B1、…、被控线程BN中进行信号注册,并定义相应的接收信号类型和接收信号处理函数,被控线程B1、…、被控线程BN分别对应不同的接收信号类型,接收信号处理函数对不同的接收信号类型进行处理; 
步骤4:对主控线程A进行实时监控,检测其是否需要实时挂起1个或多个被控线程,如果是,则转至步骤5;如果否,则检测其是否需要恢复被控线程使其继续运行,如果是,则转到步骤6,如果否,则循环执行该步骤4; 
步骤5:主控线程A执行挂起被控线程的操作:主控线程A向待被挂起的被控线程发送步骤3定义的接收信号类型;被控线程接收到该接收信号类型,执行相应的接收信号处理函数,将该被控线程挂起;返回步骤4;其中,接收信号处理函数首先对互斥锁执行申请操作,由于互斥锁已经被主控线程A申请了,所以被控线程申请不到互斥锁,只能挂起等待;
步骤6:主控线程A恢复被控线程,使其继续运行:主控线程A释放掉之前申请到的互斥锁;则此时互斥锁处于可被申请状态,立即唤醒被控线程,被控线程成功申请到互斥锁,则继续运行;被控线程申请到互斥锁后立即释放掉(被控线程此时已经用不到互斥锁了,释放掉,可以让主控线程A获取到,这样子可以让下一次挂起顺利进行),并继续运行,等待主控线程A发送的下一个接收信号类型的到来; 
步骤7:主控线程A再次申请互斥锁,并转到步骤4。
实施例3
步骤1:定义多个全局的互斥锁,并初始化该互斥锁;
步骤2:创建主控线程和被控线程,1个主控线程可同时控制1个或多个被控线程,本实施例中,主控线程为1个,记为主控线程A;被控线程为N个,记为被控线程B1、…、被控线程BN,N≥2;主控线程A控制N个被控线程,则需要将每个被控线程注册为不同的信号类型,这样子才能更清楚、更精确的控制。可以做到分开的控制不同的线程挂起或恢复;
步骤3:在主控线程A中申请互斥锁,在被控线程B1、…、被控线程BN中进行信号注册,并定义相应的接收信号类型和接收信号处理函数,被控线程B1、…、被控线程BN分别对应不同的接收信号类型,接收信号处理函数对不同的接收信号类型进行处理; 
步骤4:对主控线程A进行实时监控,检测其是否需要实时挂起1个或多个被控线程,如果是,则转至步骤5;如果否,则检测其是否需要恢复被控线程使其继续运行,如果是,则转到步骤6,如果否,则循环执行该步骤4; 
步骤5:主控线程A执行挂起被控线程的操作:主控线程A向待被挂起的被控线程发送步骤3定义的接收信号类型;被控线程接收到该接收信号类型,执行相应的接收信号处理函数,将该被控线程挂起;返回步骤4;其中,接收信号处理函数首先对互斥锁执行申请操作,由于互斥锁已经被主控线程A申请了,所以被控线程申请不到互斥锁,只能挂起等待;
步骤6:主控线程A恢复被控线程,使其继续运行:主控线程A释放掉之前申请到的互斥锁;则此时互斥锁处于可被申请状态,立即唤醒被控线程,被控线程成功申请到互斥锁,则继续运行;被控线程申请到互斥锁后立即释放掉(被控线程此时已经用不到互斥锁了,释放掉,可以让主控线程A获取到,这样子可以让下一次挂起顺利进行),并继续运行,等待主控线程A发送的下一个接收信号类型的到来; 
步骤7:主控线程A再次申请互斥锁,并转到步骤4。
该方案使的一个主控线程可以精确、随时的对多个被控线程进行控制,而且达到了硬实时控制的目的。使得各线程间的交互性更加方便和容易控制。
实施例4
步骤1:定义一个全局的互斥锁,并初始化该互斥锁;
步骤2:创建主控线程和被控线程,1个主控线程可同时控制1个或多个被控线程,本实施例中,主控线程为1个,记为主控线程A;被控线程均为N个,记为被控线程B1、…、被控线程BN,N≥2;主控线程A控制N个被控线程,则需要将每个被控线程注册为相同的信号类型,这样子才能同时对各个被控线程进行同时控制;
步骤3:在主控线程A中申请互斥锁,在被控线程B1、…、被控线程BN中进行信号注册,并定义共同的接收信号类型和接收信号处理函数,被控线程B1、…、被控线程BN都对应相同的接收信号类型,接收信号处理函数对该接收信号类型进行处理,即接收信号处理函数也为同一个; 
步骤4:对主控线程A进行实时监控,检测其是否需要同时实时挂起多个被控线程,如果是,则转至步骤5;如果否,则检测其是否需要恢复被控线程使其继续运行,如果是,则转到步骤6,如果否,则循环执行该步骤4; 
步骤5:主控线程A执行挂起被控线程的操作:主控线程A向本进程发送步骤3定义的接收信号类型;由于是向进程发送信号,所以信号是以广播的形式通知该进程的各个线程,方便快捷。(当然,也可以按先后顺序向各个被控线程分别发送信号)。被控线程接收到该接收信号类型,执行相应的接收信号处理函数,将该被控线程挂起;返回步骤4;其中,接收信号处理函数首先对互斥锁执行申请操作,由于互斥锁已经被主控线程A申请了,所以被控线程申请不到互斥锁,只能挂起等待;
步骤6:主控线程A恢复被控线程,使其继续运行:主控线程A释放掉之前申请到的互斥锁;则此时互斥锁处于可被申请状态,立即唤醒被控线程,被控线程成功申请到互斥锁,则继续运行;被控线程申请到互斥锁后立即释放掉(被控线程此时已经用不到互斥锁了,释放掉,可以让主控线程A获取到,这样子可以让下一次挂起顺利进行),并继续运行,等待主控线程A发送的下一个接收信号类型的到来; 
步骤7:主控线程A再次申请互斥锁,并转到步骤4。
该方案使得一个主控线程可以同时对多个被控线程进行控制,而且达到了硬实时控制的目的,使得主控线程的控制范围更加的广泛。
如果是主控线程按顺序向被控线程发送信号,则可以让被控线程在同一个互斥锁上面叠加等待,等到主控线程要恢复被控线程的时候,释放掉互斥锁,等待在互斥锁上面的各个被控线程就可以按顺序相继唤醒。这样可以有序的控制各被控线程的挂起和唤醒次序。
本方案使用了信号传递的高优先级和互斥锁的性质,达到了非常实时的挂起被控线程B和恢复被控线程B的目的,达到了硬实时的要求。
该方案超越了现有使用全局变量来循环判断变量的当前值来切换线程的运行状态所带来的不实时性;也超越了使用条件变量方法无法做到从外部控制线程的问题。使对线程的控制达到了随时随地并且硬实时的控制高度。
尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。  

一种基于LINUX的多线程硬实时控制方法.pdf_第1页
第1页 / 共9页
一种基于LINUX的多线程硬实时控制方法.pdf_第2页
第2页 / 共9页
一种基于LINUX的多线程硬实时控制方法.pdf_第3页
第3页 / 共9页
点击查看更多>>
资源描述

《一种基于LINUX的多线程硬实时控制方法.pdf》由会员分享,可在线阅读,更多相关《一种基于LINUX的多线程硬实时控制方法.pdf(9页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103345422 A (43)申请公布日 2013.10.09 CN 103345422 A *CN103345422A* (21)申请号 201310273174.0 (22)申请日 2013.07.02 G06F 9/46(2006.01) (71)申请人 厦门雅迅网络股份有限公司 地址 361000 福建省厦门市软件园二期观日 路 46 号 (72)发明人 陈华云 郑振贵 刘伟峰 郑福弟 (74)专利代理机构 厦门市诚得知识产权代理事 务所 ( 普通合伙 ) 35209 代理人 李伊飏 (54) 发明名称 一种基于 Linux 的多线程硬实时控制方法 (57)。

2、 摘要 本发明公开一种基于 Linux 的多线程硬实时 控制方法, 包括以下步骤 : 步骤 1 : 定义全局互斥 锁并初始化 ; 步骤 2 : 创建主控线程和被控线程 ; 步骤 3 : 在主控线程中申请互斥锁, 在被控线程中 进行信号注册 ; 步骤 4 : 对主控线程进行实时监 控, 检测其是否需要实时挂起被控线程, 如果是, 则转至步骤 5 ; 如果否, 则检测其是否需要恢复被 控线程, 如果是, 则转到步骤 6, 如果否, 则循环执 行步骤 4 ; 步骤 5 : 主控线程执行挂起被控线程的 操作, 返回步骤 4 ; 步骤 6 : 主控线程恢复被控线 程 ; 步骤 7 : 主控线程再次申请互。

3、斥锁, 并转到步 骤 4。本发明运用信号传递的高优先级和互斥锁 的性质, 达到了非常实时的挂起被控线程和恢复 被控线程的目的, 达到了硬实时的要求。 (51)Int.Cl. 权利要求书 1 页 说明书 6 页 附图 1 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书1页 说明书6页 附图1页 (10)申请公布号 CN 103345422 A CN 103345422 A *CN103345422A* 1/1 页 2 1. 一种基于 Linux 的多线程硬实时控制方法, 其特征在于 : 包括以下过程 : 过程 1 : 定义一个全局的互斥锁, 并在主线程中申请互斥锁 ;。

4、 在被控线程中注册信号, 并定义信号处理函数, 该信号处理函数用以申请全局的互斥锁 ; 过程 2 : 当主线程要挂起被控线程时, 向被控线程发送信号, 被控线程接收到信号后, 被阻塞挂起 ; 过程 3 : 当主线程要恢复被控线程时, 释放掉互斥锁, 则被控线程就可以获取到互斥 锁, 解除阻塞, 被控线程恢复运行。 2. 根据权利要求 1 所述的基于 Linux 的多线程硬实时控制方法, 其特征在于 : 该方法 具体包括以下步骤 : 步骤 1 : 定义全局的互斥锁, 并初始化该互斥锁 ; 步骤 2 : 创建一主控线程以及 1 个或多个被控线程 ; 步骤 3 : 在主控线程中申请互斥锁, 在被控线。

5、程中进行信号注册, 并定义相应的接收信 号类型和接收信号处理函数, 不同的被控线程对应不同的接收信号类型, 接收信号处理函 数对不同的接收信号类型进行处理 ; 步骤 4 : 对主控线程进行实时监控, 检测其是否需要实时挂起 1 个或多个被控线程, 如 果是, 则转至步骤 5 ; 如果否, 则检测其是否需要恢复被控线程使其继续运行, 如果是, 则转 到步骤 6, 如果否, 则循环执行该步骤 4 ; 步骤 5 : 主控线程执行挂起被控线程的操作 : 主控线程向待被挂起的被控线程发送步 骤 3 定义的信号 ; 被控线程接收到该信号, 执行相应的接收信号处理函数, 将该被控线程挂 起 ; 返回步骤 4。

6、 ; 步骤 6 : 主控线程恢复被控线程, 使其继续运行 : 主控线程释放之前申请到的互斥锁 ; 则此时互斥锁处于可被申请状态, 立即唤醒被控线程, 被控线程成功申请到互斥锁, 则继续 运行 ; 被控线程申请到互斥锁后立即释放掉, 并继续运行, 等待下一次的信号到来 ; 步骤 7 : 主控线程再次申请互斥锁, 并转到步骤 4。 3. 根据权利要求 1 所述的基于 Linux 的多线程硬实时控制方法, 其特征在于 : 所述步 骤 1 中, 全局的互斥锁可以为 1 个或者多个。 4. 根据权利要求 1 所述的基于 Linux 的多线程硬实时控制方法, 其特征在于 : 如果被 控线程为多个, 则步骤。

7、 3 具体是 : 在主控线程中申请互斥锁, 在被控线程中进行信号注册, 并定义共同的接收信号类型和接收信号处理函数, 不同的被控线程对应相同的接收信号类 型, 接收信号处理函数对该接收信号类型进行处理 ; 步骤 5 中, 主控线程 A 向待被挂起的被控线程发送步骤 3 定义的接收信号类型, 具体 是 : 主控线程A向本进程发送步骤3定义的接收信号类型, 以广播的形式通知该进程的各个 线程。 5. 根据权利要求 4 所述的基于 Linux 的多线程硬实时控制方法, 其特征在于 : 步骤 5 中, 主控线程 A 向待被挂起的被控线程发送步骤 3 定义的接收信号类型, 具体是 : 被控线程 在同一个。

8、互斥锁上面叠加等待, 主控线程 A 按先后顺序向各个被控线程分别发送信号 ; 当 主控线程要恢复被控线程时, 释放掉互斥锁, 等待在互斥锁上面的各个被控线程按顺序相 继唤醒。 权 利 要 求 书 CN 103345422 A 2 1/6 页 3 一种基于 Linux 的多线程硬实时控制方法 技术领域 0001 本发明涉及多线程处理, 尤其涉及基于 Linux 的多线程的硬实时控制方法。 背景技术 0002 现有的 Linux 系统开发中, 基本都会用到多线程的开发技术。而且多线程中要进 行相互的控制。 0003 当前的一般线程控制方法有 : a、 通过使用全局变量。A 线程循环判断变量的当前 。

9、值来切换状态, B 线程中修改变量值来控制 A 线程。这样做资源浪费并且无法实时控制。b、 使用条件变量。使用条件变量的线程可实现线程的唤醒, 而无法在外部对线程进行实时的 挂起, 挂起只能线程本身运行到挂起点后才可以。 因此只实现线程同步, 而没有线程实时控 制。上述现有的方法无法做到对线程的实时控制。 0004 另一方面, 在编程中, 为了保证共享数据操作的完整性, 引入了对象互斥锁的概 念。 每个对象都对应于一个可称为“互斥锁“ 的标记, 这个标记用来保证在任一时刻, 只能 有一个线程访问该对象。例如申请号为 200310114380.3 的发明专利, 公开了一种用于串行 互斥体的方法与。

10、装置, 其将互斥锁与共享数据项相关联、 并向多个执行线程提供互斥锁所 有权的机制 , 这些线程按次序对共享数据项执行代码操作。该方法主要是使用互斥锁来保 证共享数据的一致性。 其中使用到了互斥锁, 用互斥锁主要是对共享资源的保护, 让多线程 不能同时访问共享资源, 而是排着队顺序去访问的。再例如申请号为 201010182624.1 的发 明专利, 公开了一种资源共享的方法及系统, 其提供了一种资源共享的方法和系统 , 所述 方法包括下述步骤 : 设置资源与文件中的字节之间的对应关系 ; 当进程访问资源时 , 针对 文件中与该资源对应的字节申请文件锁,并在文件锁申请成功后,进程按照申请的文件锁。

11、 访问资源 ; 当进程释放资源时 , 解除进程针对文件中该资源对应的字节申请的文件锁。其 主要也是使用互斥锁对共享资源的互斥访问。其中使用到了互斥锁, 用互斥锁主要是对共 享资源的保护, 让多线程不能同时访问共享资源。 发明内容 0005 因此, 针对上述的问题, 本发明提出一种基于 Linux 的多线程硬实时控制方法, 使 用互斥锁和信号结合控制, 达到对线程的硬实时控制的目的。 0006 为了解决上述技术问题, 本发明所采用的思路是使用互斥锁和信号结合控制。其 中, 使用互斥锁, 但不是使用它来对临界资源的控制保护这一基本功能, 而是用到了一个线 程在该互斥锁上面等待跟获取的实时性, 进而。

12、达到线程的实时挂起跟恢复运行。 使用信号, 信号的发送跟接收是使用中断方式的, 所以具有较高的优先级, 使用信号可以随时并实时 的通知被控制线程, 使之挂起, 达到硬实时控制的目的。 0007 具体的, 本发明所采用的技术方案为, 一种基于 Linux 的多线程硬实时控制方法, 包括以下过程 : 过程 1 : 定义一个全局的互斥锁, 并在主线程中申请互斥锁 ; 在被控线程中注册信号, 说 明 书 CN 103345422 A 3 2/6 页 4 并定义信号处理函数, 该信号处理函数用以申请全局的互斥锁 ; 过程 2 : 当主线程要挂起被控线程时, 向被控线程发送信号, 被控线程接收到信号后, 。

13、被阻塞挂起 ; 过程 3 : 当主线程要恢复被控线程时, 释放掉互斥锁, 则被控线程就可以获取到互斥 锁, 解除阻塞, 被控线程恢复运行。 0008 其具体的实现步骤如下 : 步骤 1 : 定义一个全局的互斥锁, 并初始化该互斥锁 ; 步骤 2 : 创建一主控线程以及 1 个或多个被控线程 ; 步骤 3 : 在主控线程中申请互斥锁, 在被控线程中进行信号注册, 并定义相应的接收信 号类型和接收信号处理函数, 不同的被控线程对应不同的接收信号类型, 接收信号处理函 数对不同的接收信号类型进行处理 ; 步骤 4 : 对主控线程进行实时监控, 检测其是否需要实时挂起 1 个或多个被控线程, 如 果是。

14、, 则转至步骤 5 ; 如果否, 则检测其是否需要恢复被控线程使其继续运行, 如果是, 则转 到步骤 6, 如果否, 则循环执行该步骤 4 ; 步骤 5 : 主控线程执行挂起被控线程的操作 : 主控线程向待被挂起的被控线程发送步 骤 3 定义的接收信号类型 ; 被控线程接收到该接收信号类型, 执行相应的接收信号处理函 数, 将该被控线程挂起 ; 返回步骤 4 ; 其中, 接收信号处理函数首先对互斥锁执行申请操作, 由于互斥锁已经被主控线程申请了, 所以被控线程申请不到互斥锁, 只能挂起等待 ; 步骤 6 : 主控线程恢复被控线程, 使其继续运行 : 主控线程释放掉之前申请到的互斥 锁 ; 则此。

15、时互斥锁处于可被申请状态, 立即唤醒被控线程, 被控线程成功申请到互斥锁, 则 继续运行 ; 被控线程申请到互斥锁后立即释放掉, 并继续运行, 等待下一次的信号到来, 即 继续等待主控线程发送的接收信号类型 ; 步骤 7 : 主控线程再次申请互斥锁, 并转到步骤 4。 0009 上述步骤中, 步骤 5 是施行实时挂起被控线程的操作, 使用了信号传递的高优先 级和互斥锁的性质, 达到了非常实时的挂起线程的目的, 达到了硬实时的要求。步骤 6 是恢 复被控线程运行的操作, 由于互斥锁的自动唤醒机制, 也达到了实时恢复线程运行的目的。 0010 本发明通过上述方案, 使用了信号传递的高优先级和互斥锁。

16、的性质, 达到了非常 实时的挂起被控线程和恢复被控线程的目的, 达到了硬实时的要求。本发明使用到了互斥 锁, 不是使用互斥锁来对临界资源的控制保护这一基本功能, 或者使用互斥锁来保护共享 资源, 而是用到了一个线程在该互斥锁上面等待跟获取的实时性 (因为其不能被多个线程 同时申请到的属性) , 该互斥锁与信号配合来达到线程实时控制的目的, 进而达到线程的实 时挂起跟恢复运行。 本方案不涉及对共享资源的访问, 而是多线程中的相互控制, 只是线程 对线程的控制, 而且是实时的控制。 同时, 本发明超越了现有使用全局变量来循环判断变量 的当前值来切换线程的运行状态所带来的不实时性 ; 也超越了使用条。

17、件变量方法无法做到 从外部控制线程的问题。使对线程的控制达到了随时随地并且硬实时的控制高度。 附图说明 0011 图 1 为本发明的流程图。 说 明 书 CN 103345422 A 4 3/6 页 5 具体实施方式 0012 现结合附图和具体实施方式对本发明进一步说明。 0013 本发明提出一种基于 Linux 的多线程硬实时控制方法, 使用互斥锁和信号结合控 制, 达到对线程的硬实时控制的目的。本发明的方法包括以下过程, 首先, 定义一个全局的 互斥锁, 并在主线程中申请互斥锁 ; 在被控线程中注册信号, 并定义信号处理函数, 信号处 理函数用以申请全局的互斥锁 ; 其次, 当主线程要挂起。

18、被控线程的时候, 向被控线程发送信 号, 被控线程接收到信号后, 立即尝试去申请互斥锁, 此时互斥锁已经被主线程申请了, 所 以被控线程就申请不到, 只能被阻塞挂起, 从而达到了实时挂起线程的目的 ; 再次, 当主线 程想要恢复被控线程时, 只需把互斥锁释放掉就可以了 ; 此时被控线程就可以获取到互斥 锁, 并解除阻塞, 从而达到了恢复被控线程的目的。 0014 实施例 1 参照图 1, 本发明的方案的具体实施步骤如下 : 步骤 1 : 定义一个全局的互斥锁, 并初始化该互斥锁 ; 步骤2 : 创建主控线程和被控线程, 1个主控线程可同时控制1个或多个被控线程, 本实 施例中, 主控线程和被控。

19、线程均为 1 个, 记为主控线程 A 和被控线程 B ; 步骤 3 : 在主控线程 A 中申请互斥锁 ; 在被控线程 B 中进行信号注册, 并定义相应的接 收信号类型、 接收信号处理函数 ; 其中, 所谓的 “信号注册” , 主要是指对某一线程注册一个 信号, 让该线程以后可以接收到这个信号。至于注册哪一种信号, 也就是 “信号类型” , 这个 一般使用系统提供给用户自定义使用的 “SIGUSR1” 、“SIGUSR2” 等信号。 “接收信号处理函 数” 指的是当该线程接收到这个信号后, 要去做什么, 本方案中的 “接收信号处理函数” 是去 申请互斥锁 ; 步骤 4 : 对主控线程进行实时监控。

20、, 检测其是否需要实时挂起 1 个或多个被控线程, 如 果是, 则转至步骤 5 ; 如果否, 则检测其是否需要恢复被控线程使其继续运行, 如果是, 则转 到步骤 6, 如果否, 则循环执行该步骤 4 ; 其中, 需不需要挂起被控线程, 何时挂起或回复被 控线程, 这个是由主控线程自己决定。 他可以在自身到达某个状态后挂起被控线程、 或者接 到某种事件后挂起被控线程, 到底何时挂起这个得看具体程序的功能需要了。本发明的方 案是可以做到随时随地的控制被控线程的, 所以不论主控线程想要什么时候挂起或恢复被 控线程都没有关系 ; 步骤 5 : 主控线程 A 挂起被控线程 B : 首先主控线程 A 向待。

21、被挂起的被控线程 B 发送步 骤 3 中定义的信号 ; 被控线程 B 接收到该信号, 执行相应的信号处理函数 ; 信号处理函数首 先对互斥锁执行申请操作, 由于互斥锁已经被主控线程A申请了, 所以被控线程B申请不到 互斥锁, 只能挂起等待 ; 返回步骤 4 ; 步骤6 : 主控线程A恢复被控线程B, 使其继续运行 : 主控线程A释放掉之前申请到的互 斥锁 ; 则此时互斥锁处于可被申请状态, 立即唤醒被控线程 B, 被控线程 B 成功申请到互斥 锁, 并继续运行 ; 被控线程 B 申请到互斥锁后立即释放掉, 并继续运行, 等待下一次的信号 到来 ; 步骤 7 : 主控线程 A 再次申请互斥锁, 。

22、并转到步骤 4。 0015 本方案中的步骤 5 是施行实时挂起被控线程 B 的操作, 使用了信号传递的高优先 级和互斥锁的性质, 达到了非常实时的挂起线程的目的, 达到了硬实时的要求。步骤 6 是恢 说 明 书 CN 103345422 A 5 4/6 页 6 复被控线程 B 运行的操作, 由于互斥锁的自动唤醒机制, 也达到了实时恢复线程运行的目 的。 0016 实施例 2 步骤 1 : 定义一个全局的互斥锁, 并初始化该互斥锁 ; 步骤2 : 创建主控线程和被控线程, 1个主控线程可同时控制1个或多个被控线程, 本实 施例中, 主控线程为 1 个, 记为主控线程 A ; 被控线程均为 N 个。

23、, 记为被控线程 B1、 被控 线程 BN, N 2 ; 主控线程 A 控制 N 个被控线程, 则需要将每个被控线程注册为不同的信号 类型, 同时各个被控线程使用各自的互斥锁, 这样子才能更清楚、 更精确的控制。可以做到 分开的控制不同的线程挂起或恢复, 也可以同时对多个线程进行挂起或恢复 ; 步骤 3 : 在主控线程 A 中申请互斥锁, 在被控线程 B1、 被控线程 BN 中进行信号注 册, 并定义相应的接收信号类型和接收信号处理函数, 被控线程 B1、 、 被控线程 BN 分别对 应不同的接收信号类型, 接收信号处理函数对不同的接收信号类型进行处理 ; 步骤 4 : 对主控线程 A 进行实。

24、时监控, 检测其是否需要实时挂起 1 个或多个被控线程, 如果是, 则转至步骤 5 ; 如果否, 则检测其是否需要恢复被控线程使其继续运行, 如果是, 则 转到步骤 6, 如果否, 则循环执行该步骤 4 ; 步骤5 : 主控线程A执行挂起被控线程的操作 : 主控线程A向待被挂起的被控线程发送 步骤 3 定义的接收信号类型 ; 被控线程接收到该接收信号类型, 执行相应的接收信号处理 函数, 将该被控线程挂起 ; 返回步骤 4 ; 其中, 接收信号处理函数首先对互斥锁执行申请操 作, 由于互斥锁已经被主控线程 A 申请了, 所以被控线程申请不到互斥锁, 只能挂起等待 ; 步骤 6 : 主控线程 A。

25、 恢复被控线程, 使其继续运行 : 主控线程 A 释放掉之前申请到的互 斥锁 ; 则此时互斥锁处于可被申请状态, 立即唤醒被控线程, 被控线程成功申请到互斥锁, 则继续运行 ; 被控线程申请到互斥锁后立即释放掉 (被控线程此时已经用不到互斥锁了, 释 放掉, 可以让主控线程 A 获取到, 这样子可以让下一次挂起顺利进行) , 并继续运行, 等待主 控线程 A 发送的下一个接收信号类型的到来 ; 步骤 7 : 主控线程 A 再次申请互斥锁, 并转到步骤 4。 0017 实施例 3 步骤 1 : 定义多个全局的互斥锁, 并初始化该互斥锁 ; 步骤2 : 创建主控线程和被控线程, 1个主控线程可同时。

26、控制1个或多个被控线程, 本实 施例中, 主控线程为 1 个, 记为主控线程 A ; 被控线程为 N 个, 记为被控线程 B1、 被控线 程 BN, N 2 ; 主控线程 A 控制 N 个被控线程, 则需要将每个被控线程注册为不同的信号类 型, 这样子才能更清楚、 更精确的控制。可以做到分开的控制不同的线程挂起或恢复 ; 步骤 3 : 在主控线程 A 中申请互斥锁, 在被控线程 B1、 被控线程 BN 中进行信号注 册, 并定义相应的接收信号类型和接收信号处理函数, 被控线程 B1、 、 被控线程 BN 分别对 应不同的接收信号类型, 接收信号处理函数对不同的接收信号类型进行处理 ; 步骤 4。

27、 : 对主控线程 A 进行实时监控, 检测其是否需要实时挂起 1 个或多个被控线程, 如果是, 则转至步骤 5 ; 如果否, 则检测其是否需要恢复被控线程使其继续运行, 如果是, 则 转到步骤 6, 如果否, 则循环执行该步骤 4 ; 步骤5 : 主控线程A执行挂起被控线程的操作 : 主控线程A向待被挂起的被控线程发送 步骤 3 定义的接收信号类型 ; 被控线程接收到该接收信号类型, 执行相应的接收信号处理 说 明 书 CN 103345422 A 6 5/6 页 7 函数, 将该被控线程挂起 ; 返回步骤 4 ; 其中, 接收信号处理函数首先对互斥锁执行申请操 作, 由于互斥锁已经被主控线程。

28、 A 申请了, 所以被控线程申请不到互斥锁, 只能挂起等待 ; 步骤 6 : 主控线程 A 恢复被控线程, 使其继续运行 : 主控线程 A 释放掉之前申请到的互 斥锁 ; 则此时互斥锁处于可被申请状态, 立即唤醒被控线程, 被控线程成功申请到互斥锁, 则继续运行 ; 被控线程申请到互斥锁后立即释放掉 (被控线程此时已经用不到互斥锁了, 释 放掉, 可以让主控线程 A 获取到, 这样子可以让下一次挂起顺利进行) , 并继续运行, 等待主 控线程 A 发送的下一个接收信号类型的到来 ; 步骤 7 : 主控线程 A 再次申请互斥锁, 并转到步骤 4。 0018 该方案使的一个主控线程可以精确、 随时。

29、的对多个被控线程进行控制, 而且达到 了硬实时控制的目的。使得各线程间的交互性更加方便和容易控制。 0019 实施例 4 步骤 1 : 定义一个全局的互斥锁, 并初始化该互斥锁 ; 步骤2 : 创建主控线程和被控线程, 1个主控线程可同时控制1个或多个被控线程, 本实 施例中, 主控线程为 1 个, 记为主控线程 A ; 被控线程均为 N 个, 记为被控线程 B1、 被控 线程 BN, N 2 ; 主控线程 A 控制 N 个被控线程, 则需要将每个被控线程注册为相同的信号 类型, 这样子才能同时对各个被控线程进行同时控制 ; 步骤 3 : 在主控线程 A 中申请互斥锁, 在被控线程 B1、 被。

30、控线程 BN 中进行信号注 册, 并定义共同的接收信号类型和接收信号处理函数, 被控线程 B1、 、 被控线程 BN 都对应 相同的接收信号类型, 接收信号处理函数对该接收信号类型进行处理, 即接收信号处理函 数也为同一个 ; 步骤 4 : 对主控线程 A 进行实时监控, 检测其是否需要同时实时挂起多个被控线程, 如 果是, 则转至步骤 5 ; 如果否, 则检测其是否需要恢复被控线程使其继续运行, 如果是, 则转 到步骤 6, 如果否, 则循环执行该步骤 4 ; 步骤 5 : 主控线程 A 执行挂起被控线程的操作 : 主控线程 A 向本进程发送步骤 3 定义的 接收信号类型 ; 由于是向进程发。

31、送信号, 所以信号是以广播的形式通知该进程的各个线程, 方便快捷。 (当然, 也可以按先后顺序向各个被控线程分别发送信号) 。被控线程接收到该 接收信号类型, 执行相应的接收信号处理函数, 将该被控线程挂起 ; 返回步骤 4 ; 其中, 接收 信号处理函数首先对互斥锁执行申请操作, 由于互斥锁已经被主控线程 A 申请了, 所以被 控线程申请不到互斥锁, 只能挂起等待 ; 步骤 6 : 主控线程 A 恢复被控线程, 使其继续运行 : 主控线程 A 释放掉之前申请到的互 斥锁 ; 则此时互斥锁处于可被申请状态, 立即唤醒被控线程, 被控线程成功申请到互斥锁, 则继续运行 ; 被控线程申请到互斥锁后。

32、立即释放掉 (被控线程此时已经用不到互斥锁了, 释 放掉, 可以让主控线程 A 获取到, 这样子可以让下一次挂起顺利进行) , 并继续运行, 等待主 控线程 A 发送的下一个接收信号类型的到来 ; 步骤 7 : 主控线程 A 再次申请互斥锁, 并转到步骤 4。 0020 该方案使得一个主控线程可以同时对多个被控线程进行控制, 而且达到了硬实时 控制的目的, 使得主控线程的控制范围更加的广泛。 0021 如果是主控线程按顺序向被控线程发送信号, 则可以让被控线程在同一个互斥锁 上面叠加等待, 等到主控线程要恢复被控线程的时候, 释放掉互斥锁, 等待在互斥锁上面的 说 明 书 CN 1033454。

33、22 A 7 6/6 页 8 各个被控线程就可以按顺序相继唤醒。这样可以有序的控制各被控线程的挂起和唤醒次 序。 0022 本方案使用了信号传递的高优先级和互斥锁的性质, 达到了非常实时的挂起被控 线程 B 和恢复被控线程 B 的目的, 达到了硬实时的要求。 0023 该方案超越了现有使用全局变量来循环判断变量的当前值来切换线程的运行状 态所带来的不实时性 ; 也超越了使用条件变量方法无法做到从外部控制线程的问题。使对 线程的控制达到了随时随地并且硬实时的控制高度。 0024 尽管结合优选实施方案具体展示和介绍了本发明, 但所属领域的技术人员应该明 白, 在不脱离所附权利要求书所限定的本发明的精神和范围内, 在形式上和细节上可以对 本发明做出各种变化, 均为本发明的保护范围。 说 明 书 CN 103345422 A 8 1/1 页 9 图 1 说 明 书 附 图 CN 103345422 A 9 。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1