[发明专利]多线程访问方法及装置有效
申请号: | 201810327454.8 | 申请日: | 2018-04-12 |
公开(公告)号: | CN108762941B | 公开(公告)日: | 2020-09-08 |
发明(设计)人: | 杨亮;陈少杰;张文明 | 申请(专利权)人: | 武汉斗鱼网络科技有限公司 |
主分类号: | G06F9/52 | 分类号: | G06F9/52 |
代理公司: | 北京众达德权知识产权代理有限公司 11570 | 代理人: | 刘杰 |
地址: | 430000 湖北省武汉市东湖开*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 多线程 访问 方法 装置 | ||
本发明实施例提供了一种多线程访问方法及装置,其中,该方法包括:响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁;获取线程调用全局锁加锁时的键值;根据加锁时的键值查找全局键值对表,以获取与该键值对应的锁对象;调用全局锁的全局临界区对象对全局键值对表进行解锁;判定线程是否已经获取到锁对象;若线程已经获取到所述锁对象,则对所述锁对象对应的加锁次数计数器加一;若所述线程没有获取到锁对象,则调用所述锁对象为所述线程访问的函数对象进行加锁。本发明解决了利用类成员锁实现线程访问存在的多线程问题,保证了程序的运行稳定性,并且解决了同一线程多次连续调用全局锁而引起的死锁问题。
技术领域
本发明涉及多线程访问技术领域,尤其涉及一种多线程访问方法及装置。
背景技术
在现代计算机程序编程中,多线程被广泛运用,为了保护相关的代码或者变量,在多线程中通常采用锁机制来解决。例如在Windows系统中可以采用临界区(CriticalSection),互斥体、信号量等方法来实现锁功能。以临界区为例,利用InitializeCriticalSection系统函数初始化一个临界区对象,然后利用EnterCriticalSection系统函数对临界区进行加锁,这样其他线程运行到调用该函数地址时,就会被阻塞;调用LeaveCriticalSection系统函数对该临界区进行解锁。位于EnterCriticalSection和LeaveCriticalSection之间的代码就是线程安全的,对于有N个线程同时运行的进程来说,同时只有一个线程能够访问到这之间的代码。
但是,在C++语言中,如果将一个类对象释放之后,任何访问该类对象的成员变量都会引起程序的崩溃。假设一个包含有临界区对象的类对象在一个线程中被释放了,而另外一个线程再去访问该类对象中的临界区对象时,进程就会崩溃。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的多线程访问方法及装置。
本发明的一个方面,提供了一种多线程访问方法,所述方法包括:
响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;
获取线程调用所述全局锁加锁时的键值;
根据所述加锁时的键值查找所述全局键值对表,以获取与该键值对应的锁对象;
调用所述全局锁的全局临界区对象对所述全局键值对表进行解锁;
判定所述线程是否已经获取到所述锁对象;
若所述线程已经获取到所述锁对象,则对所述锁对象对应的加锁次数计数器加一;
若所述线程没有获取到锁对象,则调用所述锁对象为所述线程访问的函数对象进行加锁。
其中,当所述线程完成对所述函数对象的访问后,所述方法还包括:
调用全局锁的全局临界区对象对所述全局键值对表进行加锁;
获取线程调用所述全局锁解锁时的键值;
根据所述解锁时的键值查找所述全局键值对表,以获取与该键值对应的锁对象;
判定所述线程是否已经获取到所述锁对象;
若所述线程已经获取到所述锁对象,则对所述锁对象对应的加锁次数计数器减一;
调用所述全局锁的全局临界区对象对所述全局键值对表进行解锁。
其中,所述判定所述线程是否已经获取到所述锁对象,包括:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于武汉斗鱼网络科技有限公司,未经武汉斗鱼网络科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201810327454.8/2.html,转载请声明来源钻瓜专利网。
- 上一篇:多线程访问方法及装置
- 下一篇:多线程访问方法及装置