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