[发明专利]一种跨进程的线程间进行互斥的方法有效
申请号: | 201510834063.1 | 申请日: | 2015-11-25 |
公开(公告)号: | CN105511969B | 公开(公告)日: | 2020-05-19 |
发明(设计)人: | 秦远辉;周林宏;王永炎;晏琪;亓卓然;王盖;罗雄飞 | 申请(专利权)人: | 中国船舶工业系统工程研究院 |
主分类号: | G06F9/52 | 分类号: | G06F9/52 |
代理公司: | 北京天达知识产权代理事务所(普通合伙) 11386 | 代理人: | 白海燕;彭霜 |
地址: | 100096 北*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 跨进 线程 进行 方法 | ||
1.一种跨进程的线程间进行互斥的方法,包括以下步骤:
步骤一、多个线程竞争互斥信息,胜出的线程初始化互斥信息;
所述互斥信息在跨进程的线程之间使用,所述互斥信息的存储在一个不同进程间都可以访问的位置;所述互斥信息为有名信号量,在Linux操作系统中,System V标准的有名信号量以文件的形式的存储在一个公共区域,任何一个进程都可以访问到,满足互斥信息用于跨进程的线程的使用条件;当有名信号量创建之后,任何一个线程根据名称,找到对应的有名信号量文件,获取其中的信息;
所述有名信号量的创建是依据数值型的id,提供给用户的接口是字符串名称;利用映射函数将字符名称串映射成id,映射函数为hash映射;映射成id之后,判断该id代表的有名信号量是否存在,如果不存在,则直接创建并初始化有名信号量的值为1;如果存在,则直接获取有名信号量的值,并判定该有名信号量的值是否是垃圾值,若不是垃圾值,无需额外操作;如果有名信号量的值不为1,为垃圾值;若是垃圾值,则重新设置有名信号量的值为1;最后,初始化其它必要信息之后退出即可;初始化有名信号量的值为1是因为互斥访问时一次只允许一个线程访问,设置为1,一旦有一个线程通过了,值减为0之后其它线程就必须等待;
步骤二、当胜出的线程获得互斥信息之后,利用互斥信息对临界区进行加锁操作;
步骤三、进行加锁操作后,线程获得互斥信息的锁,访问共享资源;同时,其它线程进行等待;
步骤四、线程使用完共享资源之后,离开临界区,进行解锁操作;互斥信息继续被其它线程竞争,重复上述步骤;
所述步骤一进一步包括:
通过名称来判断该互斥信息在系统中是否存在;
如果否,则创建并初始化该互斥信息;
如果是,则判定该已存在的互斥信息中的值是否是垃圾值;
如果是垃圾值,则清除垃圾值并重新初始化;
如果不是垃圾值,直接获取该互斥信息;
所述通过名称来判断该互斥信息在系统中是否存在进一步包括:
获取互斥信息名称,
将互斥信息名称进行hash映射转换为id;
检查该id所代表的互斥信息是否存在;
所述步骤二进一步包括:
首先,判断当前请求加锁线程是否已经获得锁;
如果是,则返回正确;
如果否,则判断尝试枷锁的等待时间是否为无限等待;
如果是,则进行无限等待直至加锁成功;
如果否,则进行有限等待,在设定的有限时间内进行加锁等待;
如果加锁成功,则更新上锁的线程号及锁状态标记;
设置ms为用户传入的时间参数,若ms小于0则表示采取无限等待方式,只有成功得到有名信号量的锁之后才会继续执行;ms大于0表示有限等待方式,在ms时间内,如果成功获得锁就继续执行,如果没有成功获得,也会在ms时间之后继续执行,但是这种情况下会返回错误;
所述步骤四进一步包括:
首先判断当前互斥信息的状态是否是上锁状态;
如果否,即没有线程获得了互斥信息的锁,则直接返回正确;
如果是,则继续判断当前执行解锁的线程是否获得锁的线程,因为只有获得锁的线程才能进行解锁操作,其它线程不允许执行解锁操作;
如果是,则对互斥信息进行解锁操作,复位上锁线程号和锁状态;
这样其它线程又可以继续竞争;如果不是,则无法进行解锁操作,返回错误。
2.根据权利要求1所述的跨进程的线程间进行互斥的方法,其中,所述步骤四进一步包括:
当所有线程都不再继续使用互斥信息时,对互斥信息进行删除操作。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国船舶工业系统工程研究院,未经中国船舶工业系统工程研究院许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201510834063.1/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种Monkey测试方法及装置
- 下一篇:信息处理的方法及装置