CN109947575B - 读写锁的加锁、释放方法及相关系统 - Google Patents

读写锁的加锁、释放方法及相关系统 Download PDF

Info

Publication number
CN109947575B
CN109947575B CN201910218297.1A CN201910218297A CN109947575B CN 109947575 B CN109947575 B CN 109947575B CN 201910218297 A CN201910218297 A CN 201910218297A CN 109947575 B CN109947575 B CN 109947575B
Authority
CN
China
Prior art keywords
field
visitor
lock
read
reader
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910218297.1A
Other languages
English (en)
Other versions
CN109947575A (zh
Inventor
柳正龙
何仲君
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hundsun Technologies Inc
Original Assignee
Hundsun Technologies Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hundsun Technologies Inc filed Critical Hundsun Technologies Inc
Priority to CN201910218297.1A priority Critical patent/CN109947575B/zh
Publication of CN109947575A publication Critical patent/CN109947575A/zh
Application granted granted Critical
Publication of CN109947575B publication Critical patent/CN109947575B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Lock And Its Accessories (AREA)
  • Time Recorders, Dirve Recorders, Access Control (AREA)

Abstract

本发明提供了一种读写锁的加锁方法,包括:当访问者要访问共享资源时,判断读写锁的互斥锁字段是否为第一预设标识,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态;若判断出所述互斥锁字段为所述第一预设标识,则将所述互斥锁字段设置为所述访问者的标识,所述访问者的标识为预先分配给所述访问者的唯一标识;判断所述读写锁的当前状态是否满足加读写锁条件;若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中;将所述互斥锁字段设置为所述第一预设标识。通过记录的访问者标识,可知道访问者获取锁的情况,从而在访问者异常终止后,正确释放互斥锁和读写锁,将读写锁恢复。

Description

读写锁的加锁、释放方法及相关系统
技术领域
本发明涉及数据读写技术领域,特别涉及一种读写锁的加锁、释放方法及相关系统。
背景技术
在对于同一资源的访问读多写少的应用场景中,采用互斥锁会很大程度的降低程序的效率,所以为了提高并发性能,程序设计时,经常会用到读写锁。
读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。一般情况下,读写锁能允许同时有多个读者来访问共享资源,且允许单个写者修改共享资源。访问者需要获取读写锁,才能访问共享资源,在访问完成后将读写锁释放。
访问者要先获取读写锁内部的互斥锁,才能获取和释放读写锁,在完成获取或是释放读写锁后,将互斥锁释放。所述互斥锁在任意时刻仅能被一个访问者持有。访问者获取互斥锁后,在加读写锁时,将写者标识设置为1或将读者计数器加1,完成加读写锁。相应的,在解读写锁时,将写者字段设置为0或将读者减1,完成解读写锁。
当存在访问者发生异常终止时,无法确认异常终止的访问者是否已获取了读写锁中的互斥锁,从而无法确定是否需要释放互斥锁。若在不确定情况下释放互斥锁,可能会将正常运行的访问者的互斥锁释放了。若不释放互斥锁,则所述异常终止的访问者可能已经获得了互斥锁。此时,其他访问者将无法获取互斥锁从而获取读写锁。
并且,根据写者标识和读者计数器,也无法确定异常终止的访问者是否已经获取了读写锁,同样也无法确定是否要释放读写锁。也无法正确的释放异常终止的访问者获取的读写锁。使得读写锁无法被恢复,出现死锁。所以,在访问者发生异常终止后,能够明确知道互斥锁与读写锁的被获取情况,从而能恢复读写锁,显得尤为重要。
发明内容
基于上述现有技术的不足,本发明提出一种读写锁的加锁、释放方法及相关系统,以解决访问者发生异常终止时,无法正确恢复读写锁的问题。
为解决上述问题,现提出的方案如下:
本发明的第一方面提供了一种读写锁的加锁方法,包括:
当访问者要访问共享资源时,判断读写锁的互斥锁字段是否为第一预设标识,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态;
若判断出所述互斥锁字段为所述第一预设标识,则将所述互斥锁字段设置为所述访问者的标识,所述访问者的标识为预先分配给所述访问者的唯一标识;
判断所述读写锁的当前状态是否满足加读写锁条件;
若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中;
将所述互斥锁字段设置为所述第一预设标识。
可选地,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者获取所述互斥锁时,设置为所述访问者的标识;所述写者字段用于在所述访问者获取写锁时,设置为所述访问者的标识;所述读者字段包括读者链表,所述读者链表用于在所述访问者获取读锁时,记录所述访问者的标识。
可选地,所述判断所述读写锁的当前状态是否满足加读写锁条件,包括:
若所述访问者为写者,判断所述读写锁的当前状态是否满足加写锁条件;其中,所述加写锁条件为所述写者字段为第二预设标识且所述读者字段为空,所述第二预设标识用于表示未存在写者获取所述读写锁;
其中,所述若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中,包括:
若所述访问者为写者,且判断出所述读写锁的当前状态满足加写锁条件,则将所述读写锁中的写者字段设置为所述访问者的标识;
或者,所述判断所述读写锁的当前状态是否满足加读写锁条件,包括:
若所述访问者为读者,判断所述读写锁的当前状态是否满足加读锁条件,其中,所述加读锁条件为所述写者字段为所述第二预设标识;
其中,所述若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中,包括:
若所述访问者为读者,且判断出所述读写锁的当前状态满足加读锁条件,则将所述访问者的标识增加到所述读者字段的读者链表中。
可选地,所述将所述访问者的标识增加到所述读者字段的读者链表中,包括:
建立一个读者节点;
将所述建立的读者节点的数据域设置为所述访问者的标识,并设置所述建立的读者节点的指针域指向所述读者字段的读者链表的表头当前指向的节点;
将所述读者字段的读者链表的表头设置为所述建立的读者节点。
可选地,若所述访问者异常终止时,还包括:
获取所述异常终止的访问者的标识;
判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同,则将所述互斥锁字段设置为所述第一预设标识。
本发明的第二方面提供了一种读写锁的释放方法,包括:
当访问者访问完共享资源时,判断读写锁中的互斥锁字段是否为第一预设表示,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态;
若判断出所述互斥锁字段为所述第一预设标识,则将所述互斥锁字段设置为所述访问者的标识,所述标识为预先分配给所述访问者的唯一标识;
删除记录在所述读写锁的写者字段或读者字段中的访问者的标识;
将所述互斥锁字段设置为所述第一预设标识。
可选地,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者释放所述互斥锁时,设置为所述第一预设标识;所述写者字段用于在所述访问者释放写锁时,设置为第二预设表示,所述第二预设标识用于表示未存在写者获取所述读写锁;所述读者字段包括读者链表,所述读者链表中的访问者的标识,在所述访问者释放读锁时,被删除。
可选地,所述删除记录在所述读写锁中的写者字段或读者字段的所述访问者的标识,包括:
判断所述访问者的标识与所述写者字段是否相同;
若判断出所述访问者的标识与所述写者字段相同,则将所述写者字段设置为所述第二预设标识;
若判断出所述访问者的标识与所述写者字段不相同,则删除所述读者字段的读者链表中目标节点,所述目标节点记录着所述访问者的标识。
可选地,所述删除所述读者字段的读者链表中目标节点,包括:
从所述读者字段的读者链表中查找所述目标节点;
判断从所述读者字段的读者链表中是否查找到所述目标节点;
若判断出从所述读者字段的读者链表中查找到所述目标节点,则将所述目标节点的前一个节点的指针设置为指向所述目标节点的后一个节点。
可选地,若所述访问者异常终止时,还包括:
获取所述异常终止的访问者的标识;
判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同,则将所述互斥锁字段设置为所述第一预设标识。
本发明的第三方面提供了一种读写锁的加锁装置,包括:
第一判断单元,用于当访问者要访问共享资源时,判断读写锁的互斥锁字段是否为第一预设标识;
第一获取单元,用于在判断出所述互斥锁字段为第一预设标识时,将所述互斥锁字段设置为所述访问者的标识;
第二判断单元,用于判断所述读写锁的当前状态是否满足加读写锁条件;
加锁单元,用于判断出所述读写锁的当前状态满足加读写锁条件时,将所述访问者标识记录到所述读写锁的写者字段或读者字段中;
释放单元,用于将所述互斥锁字段设置为所述第一预设标识。
可选地,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者获取所述互斥锁时,设置为所述访问者的标识;所述写者字段用于在所述访问者获取写锁时,设置为所述访问者的标识;所述读者字段包括读者链表,所述读者链表用于在所述访问者获取读锁时,记录所述访问者的标识。
可选地,所述第二判断单元,包括:
第一判断子单元,用于在所述访问者为写者时,判断所述读写锁的当前状态是否满足加写锁条件;其中,所述加写锁条件为所述写者字段为第二预设标识且所述读者字段为空;
第二判断子单元,用于在所述访问者为读者时,判断判断所述读写锁的当前状态是否满足加读锁条件,其中,所述加读锁条件为所述写者字段为所述第二预设标识;
其中,所述加锁单元,包括:
加写锁单元,用于在所述访问者为写者,所述第一判断子单元判断出所述读写锁的当前状态满足加写锁条件时,将所述读写锁中的写者字段设置为所述访问者的标识;
加读锁单元,用于在所述访问者为读者,所述第二判断子单元判断出所述读写锁的当前状态满足加读锁条件时,将所述访问者的标识增加到所述读者字段的读者链表中。
可选地,所述加读锁单元,包括:
建立单元,用于建立读者节点;
插入单元,用于将所述建立的读者节点的数据域设置为所述访问者的标识,并设置所述建立的读者节点的指针域指向所述读者字段的读者链表的表头当前指向的节点;
更新单元,用于将所述读者字段的读者链表的表头设置为所述建立的读者节点。
可选地,还包括:
第二获取单元,用于获取所述异常终止的访问者的标识;
第三判断单元,用于判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
恢复单元,用于判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同时,将所述互斥锁字段设置为所述第一预设标识。
本发明的第四方面提供了一种读写锁的释放装置,包括:
第四判断单元,用于当访问者访问完共享资源时,判断读写锁中的互斥锁字段是否为第一预设标识;
第三获取单元,用于在判断出所述互斥锁字段为第一预设标识时,将所述互斥锁字段设置为所述访问者的标识;
解锁单元,用于删除记录在所述读写锁的写者字段或读者字段中的访问者的标识;
释放单元,用于将所述互斥锁字段设置为零。
可选地,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者释放所述互斥锁时,设置为所述第一预设标识;所述写者字段用于在所述访问者释放写锁时,设置为第二预设标识;所述读者字段包括读者链表,所述读者链表中的访问者的标识,在所述访问者释放读锁时,被删除。
可选地,所述解锁单元,包括:
第五判断单元,用于判断所述访问者的标识与所述写者字段是否相同;
写锁释放单元,用于在判断出所述访问者的标识与所述写者字段相同时,将所述写者字段设置为所述第二预设标识;
读锁释放单元,用于在判断出所述访问者的标识与所述写者字段不相同,删除所述读者字段的读者链表中目标节点,所述目标节点记录着所述访问者的标识。
可选地,所述读锁释放单元,包括:
查找单元,用于从所述读者字段的读者链表中查找所述目标节点;
第六判断单元,用于判断从所述读者字段的读者链表中是否查找到所述目标节点;
删除单元,用于在从所述读者字段的读者链表中查找到所述目标节点时,将所述目标节点的前一个节点的指针设置为指向所述目标节点的后一个节点。
可选地,还包括:
获取单元,用于获取所述异常终止的访问者的标识;
第七判断单元,用于判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
恢复单元,用于判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同时,将所述互斥锁字段设置为所述第一预设标识。
本发明的第五方面提供了一种电子设备,包括处理器和存储器;其中:
所述存储器同于存储计算机指令;
所述处理器用于执行所述存储器存储的计算机指令,具体执行本发明第一方面中任意一项所述的读写锁的加锁方法,或者,执行本发明第二方面中任意一项所述的读写锁的释放方法。
本发明的第六方面提供了一种存储介质,用于存储程序,所述程序被执行时,用于实现本发明第一方面中任意一项所述的读写锁的加锁方法,或者,执行本发明第二方面中任意一项所述的读写锁的释放方法。
通过上述的技术方法可以看出,本发明提供的一种读写锁的实现方法中,通过当访问者要访问共享资源,获取读写锁中的互斥锁时,将互斥锁字段设置为所述访问者的唯一标识,在释放互斥锁时,将互斥锁字段设置为第一预设标识。所以,通过所述互斥锁字段就可以确定所述互斥锁是否被获取,在获取时通过所述标识可确定获取互斥锁的访问者。在发生异常终止时,根据所述发生异常终止的访问者的标识与所述互斥锁字段对比,可确定所述互斥锁是否被所述异常终止的访问者获取了,从而能正确的释放互斥锁,恢复读写锁的结构。并且,在获取读写锁时会将所述访问者的标识,记录在读写锁的写者字段或读者字段中。所以,通过读写锁的写者字段和读者字段就可得到读写锁的被获取情况。在发送异常终止时,同样能通过记录在读写锁中的访问者标识,确定读写锁是否被获取,是否被异常终止的访问者获取,从而能正确释放读写锁,恢复读写锁。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例公开的一种读写锁的结构示意图;
图2为本发明另一实施例公开的一种读写锁的加锁方法的流程图;
图3为本发明另一实施例公开的写者加读写锁的流程图;
图4为本发明另一实施例公开的读者加读写锁的流程图;
图5为本发明另一实施例公开的读者加读写锁的流程图;
图6为本发明另一实施例公开的恢复读写锁内部互斥锁的流程图;
图7为本发明另一实施例公开的一种读写锁的释放方法的流程图;
图8为本发明另一实施例公开的一种读写锁的释放方法的流程图;
图9为本发明另一实施例公开的一种读写锁的释放方法的流程图;
图10为本发明另一实施例公开的一种读写锁的加锁装置的结构示意图;
图11为本发明另一实施例公开的一种读写锁的释放装置结构示意图;
图12为本发明另一实施例公开的一种电子设备的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
首先需要说明的是,本发明实施例公开了一种可恢复的读写锁101,参见图1,包括:互斥锁字段102、写者字段103及读者字段104。
其中,所述互斥锁字段102用于在访问者获取到所述读写锁内部的互斥锁时,设置为所述访问者的标识。其中,所述访问者在加读写锁和释放读写锁时都需要获取所述读写锁的互斥锁。在所述访问者释放所述互斥锁时,将所述互斥锁字段设置为第一预设标识,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态。也就是所述互斥锁字段为所述第一预设标识时,表示所述互斥锁处于可被获取的状态。其中,所述访问者在加读写锁和释放读写锁完成后都需要释放之前获取的所述读写锁的互斥锁。所述互斥锁在任意时刻只能被一个访问者获取。所以将所述互斥锁字段初始化为所述第一预设标识。当所述互斥锁字段为所述第一预设标识时,说明此时所述互斥锁未被获取,访问者可以获取所述互斥锁。
需要说明的是,恢复读写锁需要先恢复读写锁中的互斥锁,所以本发明实施例中所提供的读写锁中的互斥锁同样是可恢复的。通过所述互斥锁字段可得到所述互斥锁的被获取情况,所以,在访问者发生异常终止时,就可以确定互斥锁是否被异常终止的访问者获取,从而能实现互斥锁的可恢复性。
需要说明的是,读写锁将访问者分为写者和读者。写者获取或释放读写锁时,读写锁称为写锁,所述写者指的是对共享资源进行写操作的访问者。读者获取或释放读写锁时,读写锁称为读锁,所述读者指的是仅对所述共享资源进行读操作的访问者。所述读写锁中的写者字段103用于在写者获取写锁时,设置为所述写者的标识,在写者释放写锁时,将所述写者字段设置为第二预设标识,所述第二预设标识用于表示未存在写者获取所述读写锁。也就是,当所述写者字段为所述第二预设标识时,表示当前未有写者持有所述读写锁。所述写者字段初始化为第二预设标识,所以通过写者字段就可判断出读写锁是否被写者获取了。
所述读者字段104包括读者链表,所述读者链表用于在所述访问者获取读锁时,记录所述访问者的标识。由于读写锁允许多个读者同时获得读写锁,本实施例通过链表来记录所有同时访问的读者的标识。所述读者链表的节点包括数据域和指针域两个部分,所述数据域用于记录所述访问者的标识,所述指针域为指向下一个链表节点的指针。在所述访问者释放读锁时,将读者字段的读者链表中记录有所述访问者的标识的节点删除。所述读者字段初始化为空,所以当读者字段为空时,说明没有读者已经获取读写锁。并且根据各个节点记录的标识,就可知道具体哪个访问者获取了读写锁。
需要说明的是,通过链表来记录多个读者的标识仅是其中一种可选的方式,采用其他可以存储多个信息的同等方式来记录所述多个读者的标识,比如采用位图或数组的方式来实现,都属于本发明的范畴。
还需要说明的是,所述访问者的标识为预先分配给所述访问者的唯一标识。作为访问者的进程/线程未加读写锁前,预先为每一个进程/线程分配一个唯一的标识,作为获取读写锁时的一个参数。所述访问者的标识可以为内核分配的进程号或线程号,也可以是设计人员自己定义的标识。每个进程/线程对应一个标识,通过所述标识可区分不同的访问者。
所述第一预设标识及第二预设标识,区别于所述访问者标识,不能与任意一个所述访问者的标识存在相同的情况。所述第一预设标识及第二标识,同样为预先设定好两个标识,分别用于表示所述互斥锁处于空闲状态及未存在写者获取所述读写锁。所述第一预设标识和第二预设标识可由设计人员自定义。由于互斥锁字段与写者字段是相互独立的,所以两个预设标识是可以一样的,也可以是不同的,只要能表示出所述互斥锁处于空闲状态及未存在写者获取所述读写锁即可。例如,两个预设标识都设置为零,当所述互斥锁字段为零时,表示所述互斥锁处于空闲状态,当所述写者字段为零时,则表示当前未存在写者获取所述读写锁,此时就不能将访问者的标识设置为零。
本发明实施例公开的上述格式的读写锁,不仅仅限于在单台计算机的多进程/线程环境中使用,也可以用于分布式系统中。
基于上述格式的读写锁,本发明另一实施例公开了一种读写锁的加锁方法,参见图2,包括:
S201、当访问者要访问共享资源时,判断读写锁的互斥锁字段是否为第一预设标识。
需要说明的是,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态。在本实施例中,所述访问者为系统的进程/线程。只有获取了读写锁的访问者才被允许访问所述共享资源,所以当访问者试图要访问所述共享资源时,需要加读写锁。所以,所述访问者首先要去获取读写锁中的互斥锁,在获取互斥锁后才可加读写锁。
因为互斥锁在任意时刻只能被一个访问者持有,当有已存在访问者获得互斥锁后,其他访问者将不能获取所述互斥锁,也就不能进行加读写锁,直至所述互斥锁被释放。所以,在任意一个时刻,只能有一个访问者进行加读写锁。本实施例中,互斥锁字段为第一预设标识,表示所述读写锁的互斥锁处于可获取状态。所以,访问者要获取时,需要判断所述读写锁的互斥锁字段是否为第一预设标识,在所述互斥锁字段为第一预设标识时,获取所述互斥锁。
若通过步骤S201判断出所述互斥锁字段为所述第一预设标识,则执行步骤S202、将所述互斥锁字段设置为所述访问者的标识。
将所述互斥锁字段从所述第一预设标识设置为所述访问者的标识,意味着所述访问者获取了读写锁中的互斥锁,可去执行步骤S203,进一步去加读写锁。所述访问者此时,已占用所述互斥锁,其他访问者将不能获取互斥锁去进行加锁。避免了同时存在多个访问者获取读写锁,出现错乱。
需要说明的是,当判断出所述读写锁的互斥锁字段不为所述第一预设标识时,此时的所述要访问共享资源的访问者将无法获取互斥锁。本实施例中所述互斥锁采用自旋锁方式实现,访问者在无法获取互斥锁时会不断的自旋,即不断的尝试获取互斥锁。所以,此时访问者将不断循环的判断所述读写锁的互斥锁字段是否为第一预设标识。但是,为了降低中央处理器的消耗,当判断出所述读写锁的互斥锁字段不为第一预设标识时,也可以对所述访问者进行堵塞等待,直至能获取互斥锁时,才被唤醒。
S203、判断所述读写锁的当前状态是否满足加读写锁条件。
S204、若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中。
需要说明的是,读写锁允许单个写者或多个读者访问共享资源。写者对于读写锁是独占的,当一个写者获得读写锁后,其他写者和读写都不能再获得该读写锁,或当有读者获取读写锁后,写者也不能获取该读写锁。从而避免了存在多个写者同时修改所述共享资源,造成错乱。因此,写者能加读写锁的条件为,不存在写者或读者已获得所述读写锁。
读者仅是读取所述共享文件,所以读者之间对读写锁是共享的,允许多个读者同时获得读写锁。因此,读者可加读写锁的条件为,不存在写者已获得所述读写锁。所以写者能加读写锁的条件与读者能加读写锁的条件是不同的。
当所述访问者为写者时,可选地,本发明另一实施例中,参见图3,所述步骤S203包括:
S301、判断所述读写锁的当前状态是否满足加写锁条件,所述加写锁条件为所述写者字段为第二预设标识且所述读者字段为空。
需要说明的是,所述第二预设标识用于表示未存在写者获取所述读写锁。本实施例,通过写者字段与读者字段的状态,判断所述读写锁当前是否已被其他访问者获取了。写者字段为第二预设标识表示未有写者获得所述读写锁,读者字段为空表示未有读者获得所述读写锁。所以,所述步骤S301也可以表述为:判断所述读写锁的写者字段是否为第二预设标识且读者字段为空。当写者字段为第二预设标识且读者字段为空时,满足写者对读写锁的独占条件,所述访问者能获取所述读写锁。其他的访问者将无法获取所述读写锁,直至所述读写锁被释放。
并且,本实施例中,所述步骤S204的一种实施方式,同样参见图3,具体为:
S302、若所述访问者为写者,且判断出所述读写锁的当前状态满足加写锁条件,则将所述读写锁中的写者字段设置为所述访问者的标识。
所述读写锁中的写者字段设置为所述访问者的标识之后,所述访问者获得读写锁,可修改所述共享资源。其他访问者将不能再获取所述读写锁。
当所述访问者为读者时,可选地,本发明另一具体实施例中,参见图4,所述步骤S203包括:
S401、判断所述读写锁的当前状态是否满足加读锁条件。
其中,所述加读锁条件为所述写者字段为所述第二预设标识。也就是,判断所述读写锁当前是否已被写者获取了。本实施例中,所述写者字段为第二预设标识说明未存在写者获得所述读写锁。所以,所述步骤S401也可以表述为:判断所述读写锁的写者字段是否为第二预设标识。因为读者间能共享读写锁,所以当所述写者字段为第二预设标识时,即使已有读者获得所述读写锁,所述访问者依然能获取读写锁。
并且,本实施例中,所述步骤S204的另一种实施方式,如图4所示,具体为:
S402、若所述访问者为读者,且判断出所述读写锁的当前状态满足加读锁条件,则将所述访问者的标识增加到所述读者字段的读者链表中。
所述将所述访问者的标识增加到所述读者字段的读者链表中后,所述访问者获得读写锁,可读取所述共享资源。
可选地,本发明另一实施例中,如图5所示,所述步骤S402中,将所述访问者的标识增加到所述读者字段的读者链表中的一种具体实施方式,包括:
S501、建立一个读者节点。
所述节点包括数据域与指针域两部分,所述数据域用于记录所述访问者的标识,所述指针域为指向下一个节点的指针。
S502、将所述建立的读者节点的数据域设置为所述访问者的标识,并设置所述建立的读者节点的指针域指向所述读者字段的读者链表的表头当前指向的节点。
需要说明的是,本实施中,通过前插法将所述建立的读者节点增加到所述读者链表中。也就是在将所述建立的读者节点增加到当前所述读者链表的第一个节点前。采用前插法,仅是本发明的一种可选的方式,通过等同的方法将记录有所述访问者的节点增加到链表中,都属于本发明的范畴,比如采用后插法,将所述建立的读者节点增加到所述读者链表的最后。
S503、将所述读者字段的读者链表的表头设置为所述建立的读者节点。
链表的表头指向链表中的第一个节点,由于所述建立的读者节点增加到了所述读者链表的最前面,成为了链表中的第一个节点。相应的读者链表的表头,应指向所述建立的读者节点。
可选地,本发明另一实施例中,同样参见图2,在执行步骤S203,判断出所述读写锁的当前状态不满足加锁条件时,还可以包括:
S206、将所述互斥锁字段设置为所述第一预设标识。
在不满足加锁条件时,需要将所述互斥锁释字段设置为第一预设标识从而将互斥锁释放,避免所述访问者一直占用互斥锁,影响其他访问者获取互斥锁。此时,所述访问者进入自旋状态,返回步骤S201再次尝试获取所述读写锁。
可选地,为了降低中央处理器的消耗,在执行步骤S206后,还可以包括:
S207、阻塞所述访问者,直至被唤醒或超时,返回步骤S201重新进行加锁。
需要说明的是,读写锁作为一种特殊的自旋锁,在因不满足加锁条件而无法加锁时,将会不断的循环的尝试加锁,直至成功加锁。这无疑会增加中央处理器的消耗。所以,在释放所述互斥锁后,将所述访问者进行阻塞,使其进入等待状态,不用一直去尝试加读写锁,从而降低中央处理器的消耗。直至所述读写被释放或等待超过设定时间时将所述访问者唤醒,再次去获取读写锁。
S205、将所述互斥锁字段设置为所述第一预设标识。
当执行步骤S204,加读写锁成功后,访问者不再需要互斥锁,所以需要执行步骤S205,将互斥锁释放,以便其他访问者能获取互斥锁,进行加锁。
可选地,本发明另一具体实施例中,参见图6,若所述访问者异常终止时,为了能正确释互斥锁,还可以包括:
S601、获取所述异常终止的访问者的标识。
S602、判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同。
S603、若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同,则将所述互斥锁字段设置为所述第一预设标识。
需要说明的是,在发生异常后若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同,则说明所述异常终止的访问者获得所述读写锁内部的互斥锁。为了恢复读写锁的内部一致性,需要将互斥锁释放。若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识不相同,则说明所述异常终止的访问者未获得所述读写锁内部的互斥锁。此时,所述互斥锁字段可能为第一预设标识,即所述互斥锁未被获取。所述互斥锁字段也可能为其他访问者的标识,所述互斥锁被其他正常运行的访问者获取了,所以互斥锁是处于正常状态的,无需释放互斥锁。
所以,本发明实施所提供的方法可在访问者异常终止时,将读写锁中的互斥锁正确恢复。可见,本发明所提供的读写锁中的互斥锁是具有可恢复性的。在访问者发生异常终止时,根据上述实施例中提供的恢复互斥锁的方法步骤,就可以将互斥锁正确的释放,从而恢复互斥锁的正常使用。
本发明另一实施例公开了一种读写锁的释放方法,参见图7,包括:
S701、判断读写锁中的互斥锁字段是否为第一预设标识。
需要说明的是,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态。当访问者访问完共享资源时,需要将获取的读写锁释放,让其他的访问者能获取所述读写锁访问所述共享资源。而要释放读写锁同样需要先去获取所述读写锁中的互斥锁。同样,在本实施例中,当互斥锁字段为所述第一预设标识时,说明此时所述互斥锁未被获取,所述访问者可获取所述互斥锁,去释放读写锁。
若判断出所述互斥锁字段为所述第一预设标识,执行步骤S702、将所述互斥锁字段设置为所述访问者的标识。
其中,所述标识为预先分配给所述访问者的唯一标识。所述标识可以为内核分配的进程号或线程号,也可以是设计人员自己定义的标识。每个进程/线程对应一个标识,通过所述标识即可区分不同的访问者。当所述互斥锁字段为第一预设标识,则所述访问者可获取所述读写锁的互斥锁,将所述互斥锁字段设置为所述访问者的标识,其他访问者将无法再获取所述互斥锁。
S703、删除记录在所述读写锁的写者字段或读者字段中的访问者的标识。
所述读写锁将访问者分为写者和读者,所述写者为对所述共享资源进行写操作的访问者,所述读者为对所述共享资源进行读操作的访问者。所述记录在所述读写锁的写者字段或读者字段中的访问者的标识,为所述访问者在加读写锁时,记录在所述读写锁的写者字段或读者字段中的。所述写者加读写锁时,将所述写者的标识记录在写者字段中。所述读者加读写锁时,将所述读者的标识记录在读者字段中。
可选地,本发明另一实施例中,参见图8,所述步骤S703的另一具体实施方式包括:
S801、判断所述访问者的标识与所述写者字段是否相同。
需要说明的是,读写锁允许单个写者或多个读者访问所述共享资源。所述写者对读写锁是独占的,写者间不共享,更不与读者共享读写锁。而读者间则是可以共享互斥锁的。
所以,若判断出所述访问者的标识与所述写者字段相同时,则需要执行步骤S802。若判断出所述访问者的标识与所述写者字段不相同,则要执行步骤S803。
S802、将所述写者字段设置为第二预设标识。
其中,所述第二预设标识用于表示未存在写者获取所述读写锁。此时,说明所述要释放读写锁的访问者为写者,不存在其他的访问者。将所述写者字段设置为第二预设标识,从而将所述访问者的标识删除,就能实现读写锁释放,结束所述访问者对所述共享资源的访问。
S803、删除所述读者字段的读者链表中目标节点,所述目标节点记录着所述访问者的标识。
此时,说明所述要释放读写锁的访问者为读者,但由于读者可能存在多个,所以只将多个读者中完成访问的所述访问者的读写锁释放。所述读者链表的一个节点记录有一个访问者的标识。所以,只将所述读者链表中记录有所述访问者的标识的目标节点删除,从而准确释访读写锁。其他读者,依然在正常读取所述共享资源。
可选地,本发明另一实施例中,参见图9,步骤S803的另一具体实施方式为:
S901、从所述读者字段的读者链表中查找所述目标节点。
S902、判断从所述读者字段的读者链表中是否查找到所述目标节点。
需要说明的是,若从所述读者字段的读者链表中查找到所述目标节点,则执行步骤S903。若从所述读者字段的读者链表中未查找到所述目标节点说明所述访问者的标识不存在读者字段中。此时,可能是出现了差错,所获取到的所述访问者的标识不合法,或是所述访问者并未获取到读写锁。此时,不需要释放读写锁,直接执行步骤S704。
S903、将所述目标节点的前一个节点的指针设置为指向所述目标节点的后一个节点。
需要说明的是,当所述目标节点为所述读者的第一节点时,所述目标节点的前一节点为所述读者链表的表头。链表的表头是一个指针。此时,将所述链表的表头指向所述目标节点的后一个节点。这样,就将所述目标节点从所述读者链表中删除了。当所述目标节点为所述读者链表的最后一个节点时,所述目标节点的指针指向空,所述目标节点后没有节点。此时,将所述目标节点的后一个节点视为空,将所述目标节点的前一个节点的指针指向空,从而删除所述目标节点,释放所述目标节点获取的读写锁。
S704、将所述互斥锁字段设置为所述第一预设标识。
无论写者的读写锁还是读者的读写锁在释放完成,最后都要将互斥锁也释放,所以在执行完步骤S703释放完读写锁后,需要执行步骤S704。
可选地,本发明另一实施例中,同样参见图7,执行步骤S704,释放互斥锁后,还可以进一步包括:
S705、唤醒等待加锁的访问者。
所述获取读写锁后,后续的访问者未能获取读写锁的访问者,被阻塞,处于等待状态。此时,所述读写锁被释放,等待的访问者有可能有机会获取所述读写锁,所以将等待的访问者唤醒,去获取所述读写锁。
可选地,本发明另一实施例中,若所述访问者异常终止时,为了能确定所述异常终止的访问者是否获取了互斥锁,并正确释互斥锁,实现互斥锁的可恢复性,所述方法还可以包括:获取所述异常终止的访问者的标识;判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同,则将所述互斥锁字段设置为所述第一预设标识。
需要说明的是,若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识不相同。则说明所述异常终止的访问者未获得所述互斥锁。此时,互斥锁可能未被任何访问者获取也可能是被正常运行的访问者获取了,所以互斥锁是处于正常状态的,无需释放互斥锁。
在正确恢复互斥锁后,为了完全恢复读写锁,可以采用上述实施例中公开的一种读写锁的释放的方法,通过异常终止的访问者的标识去释放读写锁。
通过所述异常终止的访问者的标识,执行步骤S801,判断所述异常终止的访问者的标识与所述写者字段是否相同。若判断出所述异常终止的访问者的标识与所述写者字段相同,则说明所述异常终止的访问者为写者,并且获取了读写锁。此时,执行步骤S802、将所述写者字段设置为第二预设标识,从而将所述异常装置的访问者获取的读写锁释放,从而恢复所述读写锁。
若判断出所述异常终止的访问者的标识与所述写者字段不相同,则按照图9对应的实施例中,所公开的步骤S803的另一具体实施方式,先执行步骤S901、从读者字段的读者链表中查找记录有所述异常终止的访问者的标识的目标节点。然后执行步骤S902、判断从读者字段的读者链表中是否查找到目标节点。若判断出查找到所述目标节点,则执行步骤S903,将所述目标节点删除,从而释放所述异常终止的访问者已获取的读写锁。若判断出未能查找到所述目标节点,说明所述异常终止的访问者未获得所述读写锁。所述读写锁处于正常状态,无需释放读写锁。
通过所述方法可以确定读写锁是否被所述异常终止的访问者获取了。并且能正确的释放所述异常终止的访问者获取的读写锁,从而恢复读写锁,并且不影响其他访问者的正常运行。避免了所述异常终止的访问者一直持有读写锁,造成其他访问者无法获取读写锁,去访问所述共享资源。也避免了错误的将正常的访问者获取的读写锁释放,影响所述访问者的正常运行。
本发明另一实施例还公开一种读写锁的加锁装置,参见图10,包括:
第一判断单元1001,用于当访问者要访问共享资源时,判断读写锁的互斥锁字段是否为第一预设标识。
第一获取单元1002,用于在判断出所述互斥锁字段为所述第一预设标识时,将所述互斥锁字段设置为所述访问者的标识。
第二判断单元1003,用于判断所述读写锁的当前状态是否满足加读写锁条件。
加锁单元1004,用于判断出所述读写锁的当前状态满足加读写锁条件时,将所述访问者标识记录到所述读写锁的写者字段或读者字段中。
释放单元1005,用于将所述互斥锁字段设置为所述第一预设标识。
可选地,本实施例中,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段。其中,所述互斥锁字段用于在所述访问者获取所述互斥锁时,设置为所述访问者的标识;所述写者字段用于在所述访问者获取写锁时,设置为所述访问者的标识;所述读者字段包括读者链表,所述读者链表用于在所述访问者获取读锁时,记录所述访问者的标识。
由于,所述访问者可分为读者和写者,所述写者需要独占所述读写锁,而所述读者间可共享读写锁。所以,可选地,第二判断单元1003,包括:
第一判断子单元,用于在所述访问者为写者时,判断出所述读写锁的当前状态是否满足加写锁条件;其中,所述加写锁条件为所述写者字段为第二预设标识且所述读者字段为空。
第二判断子单元,用于在所述访问者为读者时,判断所述读写锁的当前状态是否满足加读锁条件,其中,所述加读锁条件为所述写者字段为第二预设标识。
其中,所述加锁单元1004,包括:
加写锁单元,用于在所述访问者为写者,所述第一判断子单元判断出所述读写锁的当前状态满足加写锁条件时,将所述读写锁中的写者字段设置为所述访问者的标识。
加读锁单元,用于在所述访问者为读者,所述第二判断子单元判断出所述读写锁的当前状态满足加读锁条件时,将所述访问者的标识增加到所述读者字段的读者链表中。
可选地,本发明另一实施例中,所述加读锁单元,包括:
建立单元,用于建立读者节点。
插入单元,用于将所述建立的读者节点的数据域设置为所述访问者的标识,并设置所述建立的读者节点的指针域指向所述读者字段的读者链表的表头当前指向的节点。
更新单元,用于将所述读者字段的读者链表的表头设置为所述建立的读者节点。
为了在访问者异常终止时,恢复读写锁。可选地,所述装置还可以进一步包括:
第二获取单元,用于获取所述异常终止的访问者的标识。
第三判断单元,用于判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同。
恢复单元,用于判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同时,将所述互斥锁字段设置为第一预设标识。
本发明另一实施例还公开了一种读写锁的释放装置,参见图11,包括:
第四判断单元1101,用于当访问者访问完共享资源时,判断读写锁中的互斥锁字段是否为第一预设标识。
第三获取单元1102,用于在判断出所述互斥锁字段为所述第一预设标识时,将所述互斥锁字段设置为所述访问者的标识。
解锁单元1103,用于删除记录在所述读写锁的写者字段或读者字段中的访问者的标识。
释放单元1104,用于将所述互斥锁字段设置为所述第一预设标识。
可选地,本实施例中,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段。其中,所述互斥锁字段用于在所述访问者释放所述互斥锁时,设置为第一预设标识;所述写者字段用于在所述访问者释放写锁时,设置为第二预设标识;所述读者字段包括读者链表,所述读者链表中的访问者的标识,在所述访问者释放读锁时被删除。
所述访问者可分为写者和读者,要相应的释放读者与写者的读写锁。可选地,所述解锁单元1103,包括:
第五判断单元,用于判断所述访问者的标识与所述写者字段是否相同。
写锁释放单元,用于在判断出所述访问者的标识与所述写者字段相同时,将所述写者字段设置为第二预设标识。
读锁释放单元,用于在判断出所述访问者的标识与所述写者字段不相同,删除所述读者字段的读者链表中目标节点,所述目标节点记录着所述访问者的标识。
可选地,本发明另一实施例中,所述读锁释放单元,包括:
查找单元,用于从所述读者字段的读者链表中查找所述目标节点。
第六判断单元,用于判断从所述读者字段的读者链表中是否查找到所述目标节点。
删除单元,用于在从所述读者字段的读者链表中查找到所述目标节点时,将所述目标节点的前一个节点的指针设置为指向所述目标节点的后一个节点。
为了在访问者异常终止时,恢复读写锁。可选地,本发明另一实施例中,还可以进一步包括:
获取单元,用于获取所述异常终止的访问者的标识。
第七判断单元,用于判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同。
恢复单元,用于判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同时,将所述互斥锁字段设置为第一预设标识。
通过该装置可恢复读写锁中的互斥锁。
需要说明的是,在访问者异常终止后,恢复读写锁时,通过上述公开的读写锁的释放装置,先将读写锁的互斥锁释放,再将读写锁释放。从而将整个读写锁恢复正常。
本申请上述几个实施例公开的单元的具体工作过程,可参见对应的方法实施例内容,此处不再赘述。
本发明另一实施例还公开了一种电子设备,如图12所示,包括:存储器1201和处理器1202;其中,所述存储器1201同于存储计算机指令;所述处理器1202用于执行所述存储器1201存储的计算机指令,具体执行上述中任意一个实施例中所述的读写锁的加锁方法,或者,执行上述任意一个实施例中所述的读写锁的释放方法。
本申请另一实施例还公开了一种存储介质,用于存储程序,所述程序被执行时,用于实现上述任意一个实施例中所述的读写锁的加锁方法,或者,实现上述任意一个实施例中所述的读写锁的释放方法。
在本申请上述实施例中,可以全部或者部分地通过软件、硬件或者其组合来实现。当使用软件实现时,可以全部或者部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或者多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或者部分地产生按照本申请实施例所述的流程或功能,所述计算机可以是通过计算机、专用计算机、计算机网络或者其他可编辑装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如:所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、双绞线、光纤)或者无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包括一个或者多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如:软盘、硬盘、磁带)、光介质(例如:光盘)、或者半导体介质(例如固态硬盘(SSD)等。
专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (22)

1.一种读写锁的加锁方法,其特征在于,包括:
当访问者要访问共享资源时,判断读写锁的互斥锁字段是否为第一预设标识,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态;
若判断出所述互斥锁字段为所述第一预设标识,则将所述互斥锁字段设置为所述访问者的标识,所述访问者的标识为预先分配给所述访问者的唯一标识;
基于所述读写锁的写者字段和/或读者字段,判断所述读写锁的当前状态是否满足加读写锁条件;
若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中;其中,若所述访问者为写者则将所述访问者标识记录到写者字段中,若所述访问者为读者则将所述访问者标识记录到读者字段中;
将所述互斥锁字段设置为所述第一预设标识。
2.根据权利要求1所述的方法,其特征在于,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者获取所述互斥锁时,设置为所述访问者的标识;所述写者字段用于在所述访问者获取写锁时,设置为所述访问者的标识;所述读者字段包括读者链表,所述读者链表用于在所述访问者获取读锁时,记录所述访问者的标识。
3.根据权利要求2所述的方法,其特征在于,所述判断所述读写锁的当前状态是否满足加读写锁条件,包括:
若所述访问者为写者,判断所述读写锁的当前状态是否满足加写锁条件;其中,所述加写锁条件为所述写者字段为第二预设标识且所述读者字段为空,所述第二预设标识用于表示未存在写者获取所述读写锁;
其中,所述若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中,包括:
若所述访问者为写者,且判断出所述读写锁的当前状态满足加写锁条件,则将所述读写锁中的写者字段设置为所述访问者的标识;
或者,所述判断所述读写锁的当前状态是否满足加读写锁条件,包括:
若所述访问者为读者,判断所述读写锁的当前状态是否满足加读锁条件,其中,所述加读锁条件为所述写者字段为第二预设标识;
其中,所述若判断出所述读写锁的当前状态满足加读写锁条件,则将所述访问者标识记录到所述读写锁的写者字段或读者字段中,包括:
若所述访问者为读者,且判断出所述读写锁的当前状态满足加读锁条件,则将所述访问者的标识增加到所述读者字段的读者链表中。
4.根据权利要求3所述的方法,其特征在于,所述将所述访问者的标识增加到所述读者字段的读者链表中,包括:
建立一个读者节点;
将所述建立的读者节点的数据域设置为所述访问者的标识,并设置所述建立的读者节点的指针域指向所述读者字段的读者链表的表头当前指向的节点;
将所述读者字段的读者链表的表头设置为所述建立的读者节点。
5.根据权利要求1所述的方法,其特征在于,若所述访问者异常终止时,还包括:
获取所述异常终止的访问者的标识;
判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同,则将所述互斥锁字段设置为所述第一预设标识。
6.一种读写锁的释放方法,其特征在于,包括:
当访问者访问完共享资源时,判断读写锁中的互斥锁字段是否为第一预设标识,所述第一预设标识用于表示所述读写锁中的互斥锁处于空闲状态;
若判断出所述互斥锁字段为第一预设标识,则将所述互斥锁字段设置为所述访问者的标识,所述访问者的标识为预先分配给所述访问者的唯一标识;
删除记录在所述读写锁的写者字段或读者字段中的访问者的标识;其中,若所述访问者为写者则将所述写者字段中的访问者标识删除,若所述访问者为读者则将所述读者字段中的访问者标识删除;
将所述互斥锁字段设置为所述第一预设标识。
7.根据权利要求6所述的方法,其特征在于,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者释放所述互斥锁时,设置为所述第一预设标识;所述写者字段用于在所述访问者释放写锁时,设置为第二预设标识,所述第二预设标识用于表示未存在写者获取所述读写锁;所述读者字段包括读者链表,所述读者链表中的访问者的标识,在所述访问者释放读锁时,被删除。
8.根据权利要求7所述的方法,其特征在于,所述删除记录在所述读写锁中的写者字段或读者字段的所述访问者的标识,包括:
判断所述访问者的标识与所述写者字段是否相同;
若判断出所述访问者的标识与所述写者字段相同,则将所述写者字段设置为所述第二预设标识;
若判断出所述访问者的标识与所述写者字段不相同,则删除所述读者字段的读者链表中目标节点,所述目标节点记录着所述访问者的标识。
9.根据权利要求8所述的方法,其特征在于,所述删除所述读者字段的读者链表中目标节点,包括:
从所述读者字段的读者链表中查找所述目标节点;
判断从所述读者字段的读者链表中是否查找到所述目标节点;
若判断出从所述读者字段的读者链表中查找到所述目标节点,则将所述目标节点的前一个节点的指针设置为指向所述目标节点的后一个节点。
10.根据权利要求9所述的方法,其特征在于,若所述访问者异常终止时,还包括:
获取所述异常终止的访问者的标识;
判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
若判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同,则将所述互斥锁字段设置为所述第一预设标识。
11.一种读写锁的加锁装置,其特征在于,包括:
第一判断单元,用于当访问者要访问共享资源时,判断读写锁的互斥锁字段是否为第一预设标识;
第一获取单元,用于在判断出所述互斥锁字段为所述第一预设标识时,将所述互斥锁字段设置为所述访问者的标识;
第二判断单元,用于基于所述读写锁的写者字段和/或读者字段,判断所述读写锁的当前状态是否满足加读写锁条件;
加锁单元,用于判断出所述读写锁的当前状态满足加读写锁条件时,将所述访问者标识记录到所述读写锁的写者字段或读者字段中;其中,若所述访问者为写者则将所述访问者标识记录到写者字段中,若所述访问者为读者则将所述访问者标识记录到读者字段中;
释放单元,用于将所述互斥锁字段设置为所述第一预设标识。
12.根据权利要求11所述的装置,其特征在于,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者获取所述互斥锁时,设置为所述访问者的标识;所述写者字段用于在所述访问者获取写锁时,设置为所述访问者的标识;所述读者字段包括读者链表,所述读者链表用于在所述访问者获取读锁时,记录所述访问者的标识。
13.根据权利要求11所述的装置,其特征在于,所述第二判断单元,包括:
第一判断子单元,用于在所述访问者为写者时,判断所述读写锁的当前状态是否满足加写锁条件;其中,所述加写锁条件为所述写者字段为第二预设标识且所述读者字段为空;
第二判断子单元,用于在所述访问者为读者时,判断所述读写锁的当前状态是否满足加读锁条件,其中,所述加读锁条件为所述写者字段为所述第二预设标识;
其中,所述加锁单元,包括:
加写锁单元,用于在所述访问者为写者,所述第一判断子单元判断出所述读写锁的当前状态满足加写锁条件时,将所述读写锁中的写者字段设置为所述访问者的标识;
加读锁单元,用于在所述访问者为读者,所述第二判断子单元判断出所述读写锁的当前状态满足加读锁条件时,将所述访问者的标识增加到所述读者字段的读者链表中。
14.根据权利要求13所述的装置,其特征在于,所述加读锁单元,包括:
建立单元,用于建立读者节点;
插入单元,用于将所述建立的读者节点的数据域设置为所述访问者的标识,并设置所述建立的读者节点的指针域指向所述读者字段的读者链表的表头当前指向的节点;
更新单元,用于将所述读者字段的读者链表的表头设置为所述建立的读者节点。
15.根据权利要求11所述的装置,其特征在于,还包括:
第二获取单元,用于获取异常终止的访问者的标识;
第三判断单元,用于判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
恢复单元,用于判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同时,将所述互斥锁字段设置为所述第一预设标识。
16.一种读写锁的释放装置,其特征在于,包括:
第四判断单元,用于当访问者访问完共享资源时,判断读写锁中的互斥锁字段是否为第一预设标识;
第三获取单元,用于在判断出所述互斥锁字段为所述第一预设标识时,将所述互斥锁字段设置为所述访问者的标识;
解锁单元,用于删除记录在所述读写锁的写者字段或读者字段中的访问者的标识;其中,若所述访问者为写者则将所述写者字段中的访问者标识删除,若所述访问者为读者则将所述读者字段中的访问者标识删除;
释放单元,用于将所述互斥锁字段设置为所述第一预设标识。
17.根据权利要求16所述的装置,其特征在于,所述读写锁,包括:所述互斥锁字段、所述写者字段及所述读者字段;
其中,所述互斥锁字段用于在所述访问者释放所述互斥锁时,设置为所述第一预设标识;所述写者字段用于在所述访问者释放写锁时,设置为第二预设标识;所述读者字段包括读者链表,所述读者链表中的访问者的标识,在所述访问者释放读锁时,被删除。
18.根据权利要求17所述的装置,其特征在于,所述解锁单元,包括:
第五判断单元,用于判断所述访问者的标识与所述写者字段是否相同;
写锁释放单元,用于在判断出所述访问者的标识与所述写者字段相同时,将所述写者字段设置为所述第二预设标识;
读锁释放单元,用于在判断出所述访问者的标识与所述写者字段不相同,删除所述读者字段的读者链表中目标节点,所述目标节点记录着所述访问者的标识。
19.根据权利要求18所述的装置,其特征在于,所述读锁释放单元,包括:
查找单元,用于从所述读者字段的读者链表中查找所述目标节点;
第六判断单元,用于判断从所述读者字段的读者链表中是否查找到所述目标节点;
删除单元,用于在从所述读者字段的读者链表中查找到所述目标节点时,将所述目标节点的前一个节点的指针设置为指向所述目标节点的后一个节点。
20.根据权利要求16所述的装置,其特征在于,还包括:
获取单元,用于获取异常终止的访问者的标识;
第七判断单元,用于判断所述异常终止的访问者的标识与所述互斥锁字段记录的标识是否相同;
恢复单元,用于判断出所述异常终止的访问者的标识与所述互斥锁字段记录的标识相同时,将所述互斥锁字段设置为所述第一预设标识。
21.一种电子设备,其特征在于,包括处理器和存储器;其中:
所述存储器同于存储计算机指令;
所述处理器用于执行所述存储器存储的计算机指令,具体执行如权利要求1至5中任意一项所述的读写锁的加锁方法,或者,执行如权利要求6至10中任意一项所述的读写锁的释放方法。
22.一种存储介质,其特征在于,用于存储程序,所述程序被执行时,用于实现如权利要求1至5中任意一项所述的读写锁的加锁方法,或者,执行如权利要求6至10中任意一项所述的读写锁的释放方法。
CN201910218297.1A 2019-03-21 2019-03-21 读写锁的加锁、释放方法及相关系统 Active CN109947575B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910218297.1A CN109947575B (zh) 2019-03-21 2019-03-21 读写锁的加锁、释放方法及相关系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910218297.1A CN109947575B (zh) 2019-03-21 2019-03-21 读写锁的加锁、释放方法及相关系统

Publications (2)

Publication Number Publication Date
CN109947575A CN109947575A (zh) 2019-06-28
CN109947575B true CN109947575B (zh) 2021-08-24

Family

ID=67010583

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910218297.1A Active CN109947575B (zh) 2019-03-21 2019-03-21 读写锁的加锁、释放方法及相关系统

Country Status (1)

Country Link
CN (1) CN109947575B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111814007B (zh) * 2020-07-31 2023-03-31 新华三信息安全技术有限公司 双向链表数据处理方法、装置、设备及机器可读存储介质
CN114385307B (zh) * 2020-10-20 2024-02-02 中国电信股份有限公司 数据共享方法、系统和虚拟计算单元
CN112559210B (zh) * 2020-12-16 2024-05-07 北京仿真中心 一种基于rtx实时系统的共享资源读写互斥方法
CN112969092B (zh) * 2021-01-29 2022-05-10 稿定(厦门)科技有限公司 视频文件播放系统
CN116257366A (zh) * 2021-12-09 2023-06-13 华为技术有限公司 一种锁管理方法、装置及系统

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102693159A (zh) * 2012-05-09 2012-09-26 上海晨思电子科技有限公司 基于用户模式多任务下控制硬件设备的方法及其装置
EP2466463A3 (en) * 2010-12-14 2013-06-12 AppSense Limited Process safe read/write locks
CN103488740A (zh) * 2013-09-18 2014-01-01 上海斐讯数据通信技术有限公司 一种用于实现onu设备中数据共享的系统和方法
CN103778002A (zh) * 2012-10-18 2014-05-07 华为技术有限公司 多核系统中回收临界资源的方法、装置和设备
CN105511969A (zh) * 2015-11-25 2016-04-20 中国船舶工业系统工程研究院 一种跨进程的线程间进行互斥的方法
CN107807858A (zh) * 2017-10-30 2018-03-16 北京神州绿盟信息安全科技股份有限公司 一种读写锁操作方法及系统、设备

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101364230B (zh) * 2008-09-24 2011-04-20 金蝶软件(中国)有限公司 一种并发访问控制方法及装置
CN101650646B (zh) * 2009-09-22 2012-02-08 杭州华三通信技术有限公司 一种共享数据一致性的实现方法及装置
CN103458036B (zh) * 2013-09-03 2017-02-15 杭州华三通信技术有限公司 一种集群文件系统的访问装置和方法
CN103716383B (zh) * 2013-12-13 2017-12-15 华为技术有限公司 一种访问共享资源的方法及装置
US9471400B1 (en) * 2015-07-28 2016-10-18 International Business Machines Corporation Reentrant read-write lock algorithm
CN105824709B (zh) * 2016-03-11 2019-09-17 浙江大华技术股份有限公司 一种临界区访问方法及装置
CN107992368A (zh) * 2017-11-15 2018-05-04 国家计算机网络与信息安全管理中心 一种多进程间的数据交换方法和系统

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP2466463A3 (en) * 2010-12-14 2013-06-12 AppSense Limited Process safe read/write locks
CN102693159A (zh) * 2012-05-09 2012-09-26 上海晨思电子科技有限公司 基于用户模式多任务下控制硬件设备的方法及其装置
CN103778002A (zh) * 2012-10-18 2014-05-07 华为技术有限公司 多核系统中回收临界资源的方法、装置和设备
CN103488740A (zh) * 2013-09-18 2014-01-01 上海斐讯数据通信技术有限公司 一种用于实现onu设备中数据共享的系统和方法
CN105511969A (zh) * 2015-11-25 2016-04-20 中国船舶工业系统工程研究院 一种跨进程的线程间进行互斥的方法
CN107807858A (zh) * 2017-10-30 2018-03-16 北京神州绿盟信息安全科技股份有限公司 一种读写锁操作方法及系统、设备

Also Published As

Publication number Publication date
CN109947575A (zh) 2019-06-28

Similar Documents

Publication Publication Date Title
CN109947575B (zh) 读写锁的加锁、释放方法及相关系统
US20190129894A1 (en) Database Transaction Processing Method, Client, and Server
EP3026582B1 (en) Transaction control block for multiversion concurrency commit status
CN108363806B (zh) 数据库的多版本并发控制方法、装置、服务器及存储介质
US8396831B2 (en) Optimistic serializable snapshot isolation
US7702660B2 (en) I/O free recovery set determination
US8375062B2 (en) Simple optimistic skiplist
US8660988B2 (en) Fine-grained and concurrent access to a virtualized disk in a distributed system
US8407195B2 (en) Efficient multi-version locking for main memory databases
CN111090663B (zh) 事务并发控制方法、装置、终端设备及介质
CN112199204B (zh) 一种在区块链中处理交易的方法和装置
US9514170B1 (en) Priority queue using two differently-indexed single-index tables
EP3438845A1 (en) Data updating method and device for a distributed database system
CN111316255B (zh) 数据存储系统以及用于提供数据存储系统的方法
CN113342507B (zh) 一种分布式锁服务实现方法、装置及计算机设备
US7444349B1 (en) Control of concurrent access to a partitioned data file
US20240119039A1 (en) Writing graph data
CN114327642A (zh) 一种数据读写的控制方法及电子设备
CN115408178B (zh) 用于保护对片上资源的访问的方法、介质和电子设备
JP2003271436A (ja) データ処理方法、データ処理装置およびデータ処理プログラム
US20080082533A1 (en) Persistent locks/resources for concurrency control
CN111597149B (zh) 一种数据库的数据清理方法及装置
KR102123616B1 (ko) 충돌 페이지 리스트를 이용한 병렬 저널링 방법 및 그 장치
JP4280306B2 (ja) トランザクションメッセージキューイングシステムのためのログベースデータアーキテクチャ
CN107818136B (zh) 用于回收垃圾对象数据的方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant