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.一种多线程访问方法,其特征在于,所述方法包括:响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;获取线程调用所述全局锁加锁时的键值;判定所述全局键值对表中是否存在与加锁时的键值对应的锁对象,所述全局键值对表中的每一锁对象设置有用于记录引用次数的引用计数器;若所述全局键值对表中不存在与加锁时的键值对应的锁对象,则创建新的锁对象,为所述新的锁对象生成引用计数器并将该引用计数器的计数值加1,并将创建的锁对象以及所述锁对象与指定的键值之间的对应关系添加到所述全局键值对表;调用所述全局临界区对象对所述全局键值对表进行解锁;调用创建的新的锁对象为所述线程访问的函数对象进行加锁。2.根据权利要求1所述的方法,其特征在于,当所述线程完成对所述函数对象的访问后,所述方法还包括:调用所述全局临界区对象对所述全局键值对表进行加锁;获取线程调用所述全局锁解锁时的键值;根据解锁时的键值查找所述全局键值对表,以获取与所述解锁时的键值对应的锁对象;调用获取到的锁对象对所述线程访问的函数对象进行解锁,并对获取到的锁对象的引用计数器的计数值减一;根据更新后的引用计数判定获取到的锁对象是否存在线程调用,若获取到的锁对象不存在线程调用,则释放该锁对象;调用所述全局临界区对象对所述全局键值对表进行解锁。3.根据权利要求2所述的方法,其特征在于,在所述释放所述锁对象之后,所述方法还包括:从所述全局键值对表中移除所述锁对象以及所述锁对象和与其对应的键值之间的对应关系。4.根据权利要求1-3任一项所述的方法,其特征在于,所述全局键值对表为哈希表、线性表、或树状表中的任意一个。5.一种多线程访问装置,其特征在于,所述装置包括:第一加锁模块,用于响应于线程对函数对象的访问,调用全局锁的全局临界区对象对全局键值对表进行加锁,所述全局锁配置在预先创建的全局变量中,所述全局键值对表包括锁对象和与其对应的键值之间的对应关系;获取模块...
【专利技术属性】
技术研发人员:杨亮,陈少杰,张文明,
申请(专利权)人:武汉斗鱼网络科技有限公司,
类型:发明
国别省市:湖北,42
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。