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系统开发中,基本都会用到多线程的开发技术。而且多线程中要进行相互的控制。
当前的一般线程控制方法有: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的目的,达到了硬实时的要求。
该方案超越了现有使用全局变量来循环判断变量的当前值来切换线程的运行状态所带来的不实时性;也超越了使用条件变量方法无法做到从外部控制线程的问题。使对线程的控制达到了随时随地并且硬实时的控制高度。
尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。
本文发布于:2023-04-14 21:12:01,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/3/86856.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |