一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种Linux系统信号量多线程间的通信保护方法与流程

2022-03-26 14:49:08 来源:中国专利 TAG:

一种linux系统信号量多线程间的通信保护方法
技术领域
1.本发明涉及操作系统技术领域,具体来说,涉及一种linux系统信号量多线程间的通信保护方法。


背景技术:

2.linux操作系统是一种嵌入式系统,具有较为广泛的应用,比如:医疗仪器、汽车、工业控制、航空、航天等军工领域。嵌入式系统以应用为中心,可裁剪是嵌入式系统重要特点,通常由特定功能模块和计算机控制模块组成。嵌入式linux系统具有成本低、多种硬件平台支持、优异的性能和良好的网络支持等优点。
3.线程是操作系统处理的最小单元。往往一个进程包含了多个线程,而该进程中的多个线程共享资源、地址空间和数据段。因此,必须考虑线程间的资源访问同步与互斥问题。
4.信号是一种在软件层次上对中断机制的逼进模拟,信号量在操作系统中采用p操作和v操作,其本质上是一个非负的整数计算器,用来控制对公共资源的访问。一次p操作使sem减1,一次v操作使sem加1,线程根据信号量的值来判断是否对公共资源具有访问权限。然而外部触发线程进行p操作具有随机性,当信号量sem对应v操作的线程函数未完整执行完一次时,触发又有新的大于1次以上的p操作,对应v操作的线程会漏掉对新触发的p操作的响应,带来虚假权限,导致线程间同步失效问题,常常会影响到线程的实效性和执行的可靠性。
5.针对这些问题,目前还没有有效的解决办法。


技术实现要素:

6.针对相关技术中的上述技术问题,本发明提出一种linux系统信号量多线程间的通信保护方法,能够克服现有技术的上述不足。
7.为实现上述技术目的,本发明的技术方案是这样实现的:一种linux系统信号量多线程间的通信保护方法,包括如下步骤:s1 linux系统启动后,执行应用程序,创建信号量s1~sn、创建线程t1~t
2n
、创建线程间信号量保护标识f1~fn,n为正整数;s2 使用系统提供的sem_init函数实现信号量s1~sn的初始化,使用系统提供的pthread_create函数实现线程t1~t
2n
的初始化,使用系统提供的赋值操作符,将线程间信号量保护标识f1~fn初始化为0;s3 线程t
2n 处于阻塞状态,等待被唤醒激活;s4 线程t
2n-1
中fn的值不等于0时,执行s3;线程t
2n-1
中fn的值等于0时执行s5;s5 将线程t
2n-1
中信号量保护标识fn置为1,并通过系统提供sem_post函数对信号量sn执行v操作;s6 当线程t
2n-1
中sn被执行v操作后,线程t
2n
被唤醒激活;
s7 线程t
2n
执行线程其对应函数实际内容;s8 线程t
2n
通过系统提供的sem_getvalue函数获取当前信号量sn的值,并将其赋值给信号量保护标识fn;s9 如果线程t
2n
中fn值等于0,则回到s3,等待线程被唤醒激活;否则回到s7,执行线程t
2n
其对应函数实际内容。
8.进一步地,所述n由线程间的通信实际个数确定。
9.进一步地,所述线程t
2n-1
与所述线程t
2n
之间通信需要判断信号量保护标识fn的值是否等于1。
10.进一步地,所述v操作在所述线程t
2n-1
上。
11.进一步地,一个信号量对应两个线程。
12.本发明的有益效果:本发明的通信保护方法通过增加线程间信号量保护标识,线程间通过对信号量保护标识值的判定,来进一步判定是否真的需要激活通信对象的线程,从而有效地解决线程间通信的同步问题和虚假权限问题,保障了线程间的实效性和执行的可靠性。
附图说明
13.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
14.图1是根据本发明实施例所述的linux系统信号量多线程间的通信保护方法流程图。
具体实施方式
15.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的范围。
16.如图1所示,根据本发明实施例所述的一种linux系统信号量多线程间的通信保护方法,包括如下步骤:s1 linux系统启动后,执行应用程序,创建信号量s1~sn、创建线程t1~t
2n
、创建线程间信号量保护标识f1~fn,n为正整数;s2 使用系统提供的sem_init函数实现信号量s1~sn的初始化,使用系统提供的pthread_create函数实现线程t1~t
2n
的初始化,使用系统提供的赋值操作符,将线程间信号量保护标识f1~fn初始化为0;s3 线程t
2n 处于阻塞状态,等待被唤醒激活;s4 线程t
2n-1
中fn的值不等于0时,执行s3;线程t
2n-1
中fn的值等于0时执行s5;s5 将线程t
2n-1
中信号量保护标识fn置为1,并通过系统提供sem_post函数对信号量sn执行v操作;
s6 当线程t
2n-1
中sn被执行v操作后,线程t
2n
被唤醒激活;s7 线程t
2n
执行线程其对应函数实际内容;s8 线程t
2n
通过系统提供的sem_getvalue函数获取当前信号量sn的值,并将其赋值给信号量保护标识fn;s9 如果线程t
2n
中fn值等于0,则回到s3,等待线程被唤醒激活;否则回到s7,执行线程t
2n
其对应函数实际内容。
17.实施例中,所述n由线程间的通信实际个数确定。
18.实施例中,所述线程t
2n-1
与所述线程t
2n
之间通信需要判断信号量保护标识fn的值是否等于1。
19.实施例中,所述v操作在所述线程t
2n-1
上。
20.实施例中,一个信号量对应两个线程。
21.具体方法实施流程如下:(1)linux系统启动后,执行应用程序,开始创建信号量s1~sn、创建线程t1~t
2n
、创建线程间信号量保护标识f1~fn;其中n表示个数,由线程间的通信实际个数决定;便于描述,使用逻辑规定,假设{s1、t1、t2、f
1 }为第一组线程间的通信g1,{s2、t3、t4、f
1 }第二组线程间的通信为g2,根据n的取值不同可现实n组线程间的通信g
n ,即{sn、t
2n-1
、t
2n
、fn};(2)使用系统提供的sem_init函数实现信号量的初始化、使用系统提供的pthread_create函数实现线程的初始化,使用系统提供的赋值操作符,将线程间信号量保护标识f1~fn全部置为0;(3)线程t
x
(1≤ x ≤2n,且n为正整数,且x为偶数),使得其处于阻塞状态,等待线程被唤醒;(4)线程t
x
(1≤ x ≤2n,且n为正整数,且x为奇数)有需要与线程t
x
(1≤ x ≤2n,且n为正整数,且x为偶数,)进行线程间通信时,判断信号量保护标识fn(1≤ x ≤n);(5)当fn的值不等于0时,执行步骤3;当fn的值等于0时执行步骤6;(6)将信号量保护标识fn值置为1,并通过系统提供sem_post函数对信号量s
x
(1≤ x ≤n)执行v操作;操作系统原理可知,必然执行步骤7;(7)线程t
x
(1≤ x ≤2n,且n为正整数,且x为偶数)激活唤醒;(8)执行线程内部需要完成的内容(如公共资源的访问);(9)通过系统提供的sem_getvalue函数获取信号量s值的大小,并将其赋值给信号量保护标识fn;(10)如果fn的值不等于0则回到步骤8;否则回到步骤3,等待线程被唤醒。
22.为了方便理解本发明的上述技术方案,以下通过具体使用方式上对本发明的上述技术方案进行详细说明。
23.在具体使用时,根据本发明所述的一种linux系统信号量多线程间的通信保护方法,根据linux系统提供的线程和信号量,实现线程间的通信,线程通过判断保护信号量保护标识fn的值来判定是否真的需要激活通信对象的线程。
24.综上所述,借助于本发明的上述技术方案,通过增加线程间信号量保护标识,线程间通过对信号量保护标识值的判定,来进一步判定是否真的需要激活通信对象的线程,从而有效地解决线程间通信的同步问题和虚假权限问题,保障了线程间的实效性和执行的可
靠性。
25.以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献