多线程访问方法及装置制造方法及图纸

技术编号:19542632 阅读:32 留言:0更新日期:2018-11-24 20:25
本发明专利技术提供了一种多线程访问方法及装置,该方法包括:响应于线程对函数对象的访问,调用全局临界区对象对全局键值对表进行加锁;获取线程调用所述全局锁加锁时的键值;判定全局键值对表中是否存在与加锁时的键值对应的锁对象,每一锁对象设置有用于记录引用次数的引用计数器;若全局键值对表中不存在对应的锁对象,创建锁对象,为该锁对象生成引用计数器并将该引用计数器的计数值加1,并将该锁对象以及锁对象与指定的键值之间的对应关系添加到全局键值对表;调用全局临界区对象对全局键值对表进行解锁;调用创建的锁对象为线程访问的函数对象进行加锁。本发明专利技术解决了利用类成员锁实现线程访问存在的多线程问题,保证了程序的运行稳定性。

Multithread Access Method and Device

The invention provides a multithreaded access method and device, which includes: in response to the thread's access to function objects, calling the global critical area object to lock the table; acquiring the key value when the thread calls the global lock; and determining whether the global key value pair exists in the table or not when the global key value pair is locked. Each lock object has a reference counter for recording the number of references; if there is no corresponding lock object in the global key value pair table, a lock object is created, a reference counter is generated for the lock object, and the count value of the reference counter is added to 1, and the lock object and the lock object are interacted with the specified key value. The corresponding relation is added to the global key value pair table; the global critical area object is invoked to unlock the global key value pair table; and the created lock object is invoked to lock the function object accessed by the thread. The invention solves the multithreading problem of thread access by using class member lock, and ensures the running stability of the program.

【技术实现步骤摘要】
多线程访问方法及装置
本专利技术涉及多线程访问
,尤其涉及一种多线程访问方法及装置。
技术介绍
在现代计算机程序编程中,多线程被广泛运用,为了保护相关的代码或者变量,在多线程中通常采用锁机制来解决。例如在Windows系统中可以采用临界区(CriticalSection),互斥体、信号量等方法来实现锁功能。以临界区为例,利用InitializeCriticalSection系统函数初始化一个临界区对象,然后利用EnterCriticalSection系统函数对临界区进行加锁,这样其他线程运行到调用该函数地址时,就会被阻塞;调用LeaveCriticalSection系统函数对该临界区进行解锁。位于EnterCriticalSection和LeaveCriticalSection之间的代码就是线程安全的,对于有N个线程同时运行的进程来说,同时只有一个线程能够访问到这之间的代码。但是,在C++语言中,如果将一个类对象释放之后,任何访问该类对象的成员变量都会引起程序的崩溃。假设一个包含有临界区对象的类对象在一个线程中被释放了,而另外一个线程再去访问该类对象中的临界区对象时,进程就会崩溃。
技术实现思路
鉴于上述问题,提出了本专利技术以便提供一种克服上述问题或者至少部分地解决上述问题的多线程访问方法及装置。本专利技术的一个方面,提供了一种多线程访问方法,所述方法包括:响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;获取线程调用所述全局锁加锁时的键值;判定所述全局键值对表中是否存在与加锁时的键值对应的锁对象,所述全局键值对表中的每一锁对象设置有用于记录引用次数的引用计数器;若所述全局键值对表中不存在与加锁时的键值对应的锁对象,则创建新的锁对象,为所述新的锁对象生成引用计数器并将该引用计数器的计数值加1,并将创建的锁对象以及所述锁对象与指定的键值之间的对应关系添加到所述全局键值对表;调用所述全局临界区对象对所述全局键值对表进行解锁;调用创建的新的锁对象为所述线程访问的函数对象进行加锁。其中,当所述线程完成对所述函数对象的访问后,所述方法还包括:调用所述全局临界区对象对所述全局键值对表进行加锁;获取线程调用所述全局锁解锁时的键值;根据解锁时的键值查找所述全局键值对表,以获取与所述解锁时的键值对应的锁对象;调用获取到的锁对象对所述线程访问的函数对象进行解锁,并对获取到的锁对象的引用计数器的计数值减一;根据更新后的引用计数判定获取到的锁对象是否存在线程调用,若获取到的锁对象不存在线程调用,则释放该锁对象;调用所述全局临界区对象对所述全局键值对表进行解锁。其中,在所述释放所述锁对象之后,所述方法还包括:从所述全局键值对表中移除所述锁对象以及所述锁对象和与其对应的键值之间的对应关系。其中,所述全局键值对表为哈希表、线性表、或树状表中的任意一个。本专利技术的另一个方面,提供了一种多线程访问装置,所述装置包括:第一加锁模块,用于响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;获取模块,用于获取线程调用所述全局锁加锁时的键值;判定模块,用于判定所述全局键值对表中是否存在与加锁时的键值对应的锁对象,所述全局键值对表中的每一锁对象设置有用于记录引用次数的引用计数器;配置模块,用于当所述全局键值对表中不存在所述键值对应的锁对象时,创建新的锁对象,为所述新的锁对象生成引用计数器并将该引用计数器的计数值加1,并将创建的锁对象以及所述锁对象与指定的键值之间的对应关系添加到所述全局键值对表;第一解锁模块,用于调用所述全局临界区对象对所述全局键值对表进行解锁;第二加锁模块,用于调用创建的新的锁对象为所述线程访问的函数对象进行加锁。其中,所述第一加锁模块,还用于当所述线程完成对所述函数对象的访问后,调用所述全局临界区对象对所述全局键值对表进行加锁;所述获取模块,还用于获取线程调用所述全局锁解锁时的键值;所述装置还包括:查找模块,用于根据解锁时的键值查找所述全局键值对表,以获取与所述解锁时的键值对应的锁对象;第二解锁模块,用于调用获取到的锁对象对所述线程访问的函数对象进行解锁,并对获取到的锁对象的引用计数器的计数值减一;所述配置模块,还用于根据更新后的引用计数判定获取到的锁对象是否存在线程调用,若获取到的锁对象不存在线程调用,则释放该锁对象;所述第一解锁模块,还用于调用所述全局临界区对象对所述全局键值对表进行解锁。其中,所述配置模块,还用于在释放所述锁对象之后,从所述全局键值对表中移除所述锁对象以及所述锁对象和与其对应的键值之间的对应关系。其中,所述全局键值对表为哈希表、线性表、或树状表中的任意一个。此外,本专利技术还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上所述方法的步骤。此外,本专利技术还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上所述方法的步骤。本专利技术实施例提供的多线程访问方法及装置,通过将全局锁配置在全局变量中,利用全局锁保证了多个访问线程中有且仅有一个线程能够获取到全局锁的锁对象,进而保证有且仅有一个线程能够访问同一函数对象,解决利用类成员锁实现线程访问过程中可能存在的野指针问题,避免可能引起的程序崩溃,保证了程序的运行稳定性。此外,本专利技术实施例在线程获取全局锁时,创建新的锁对象并为锁对象生成用于记录锁对象引用次数的引用计数器,通过控制锁对象的引用计数,使得全局锁在不被使用后可以释放,减少资源的不必要占用,解决资源不断增加的问题。而且,在创建新的锁对象时,通过保证全局键值对表中不存在与创建新的锁对象的键值相同的锁对象,进一步避免了由于内存泄露以及上锁失败而导致的进程崩溃问题。上述说明仅是本专利技术技术方案的概述,为了能够更清楚了解本专利技术的技术手段,而可依照说明书的内容予以实施,并且为了让本专利技术的上述和其它目的、特征和优点能够更明显易懂,以下特举本专利技术的具体实施方式。附图说明通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本专利技术的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:图1为本专利技术实施例的一种多线程访问方法的流程图;图2为本专利技术实施例的一种多线程访问装置的结构框图;图3为本专利技术实施例的计算机设备的示意图。具体实施方式下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。本
技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本专利技术所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与本文档来自技高网
...

【技术保护点】
1.一种多线程访问方法,其特征在于,所述方法包括:响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;获取线程调用所述全局锁加锁时的键值;判定所述全局键值对表中是否存在与加锁时的键值对应的锁对象,所述全局键值对表中的每一锁对象设置有用于记录引用次数的引用计数器;若所述全局键值对表中不存在与加锁时的键值对应的锁对象,则创建新的锁对象,为所述新的锁对象生成引用计数器并将该引用计数器的计数值加1,并将创建的锁对象以及所述锁对象与指定的键值之间的对应关系添加到所述全局键值对表;调用所述全局临界区对象对所述全局键值对表进行解锁;调用创建的新的锁对象为所述线程访问的函数对象进行加锁。

【技术特征摘要】
1.一种多线程访问方法,其特征在于,所述方法包括:响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;获取线程调用所述全局锁加锁时的键值;判定所述全局键值对表中是否存在与加锁时的键值对应的锁对象,所述全局键值对表中的每一锁对象设置有用于记录引用次数的引用计数器;若所述全局键值对表中不存在与加锁时的键值对应的锁对象,则创建新的锁对象,为所述新的锁对象生成引用计数器并将该引用计数器的计数值加1,并将创建的锁对象以及所述锁对象与指定的键值之间的对应关系添加到所述全局键值对表;调用所述全局临界区对象对所述全局键值对表进行解锁;调用创建的新的锁对象为所述线程访问的函数对象进行加锁。2.根据权利要求1所述的方法,其特征在于,当所述线程完成对所述函数对象的访问后,所述方法还包括:调用所述全局临界区对象对所述全局键值对表进行加锁;获取线程调用所述全局锁解锁时的键值;根据解锁时的键值查找所述全局键值对表,以获取与所述解锁时的键值对应的锁对象;调用获取到的锁对象对所述线程访问的函数对象进行解锁,并对获取到的锁对象的引用计数器的计数值减一;根据更新后的引用计数判定获取到的锁对象是否存在线程调用,若获取到的锁对象不存在线程调用,则释放该锁对象;调用所述全局临界区对象对所述全局键值对表进行解锁。3.根据权利要求2所述的方法,其特征在于,在所述释放所述锁对象之后,所述方法还包括:从所述全局键值对表中移除所述锁对象以及所述锁对象和与其对应的键值之间的对应关系。4.根据权利要求1-3任一项所述的方法,其特征在于,所述全局键值对表为哈希表、线性表、或树状表中的任意一个。5.一种多线程访问装置,其特征在于,所述装置包括:第一加锁模块,用于响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;获取模块...

【专利技术属性】
技术研发人员:杨亮陈少杰张文明
申请(专利权)人:武汉斗鱼网络科技有限公司
类型:发明
国别省市:湖北,42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1