读写锁控制方法及装置转让专利

申请号 : CN201710998662.6

文献号 : CN107632794A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 周应超张晨谢纲

申请人 : 北京小米移动软件有限公司

摘要 :

本公开是关于一种读写锁控制方法及装置。该方法包括:在接收到针对读写锁的写锁获取请求时,检测读写锁的状态,其中,读写锁包括写锁、第一读锁以及第二读锁;在检测到读写锁处于有第一读锁的状态时,阻塞针对读写锁的写锁获取请求以及第一读锁获取请求;放行针对读写锁的第二读锁获取请求。本公开的实施例,通过在接收到针对读写锁的写锁获取请求时,并在检测到读写锁处于有第一读锁的状态时,阻塞针对该读写锁的写锁获取请求以及第一读锁获取请求,放行针对读写锁的第二读锁获取请求,从而实现一种能够提高系统并发性的读写锁。

权利要求 :

1.一种读写锁控制方法,其特征在于,包括:在接收到针对读写锁的写锁获取请求时,检测所述读写锁的状态,其中,所述读写锁包括写锁、第一读锁以及第二读锁;

在检测到所述读写锁处于有第一读锁的状态时,阻塞针对所述读写锁的写锁获取请求以及第一读锁获取请求;

放行针对所述读写锁的第二读锁获取请求。

2.根据权利要求1所述的方法,其特征在于,所述方法还包括:在检测到所述读写锁处于没有第一读锁,而有第二读锁的状态时,阻塞针对所述读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求。

3.根据权利要求1所述的方法,其特征在于,所述方法还包括:在检测到所述读写锁处于没有第一读锁、第二读锁及写锁的状态时,放行当前的写锁获取请求,将所述读写锁的状态变为有写锁的状态;

执行与当前的写锁获取请求相关联的写操作。

4.根据权利要求3所述的方法,其特征在于,所述方法还包括:当所述读写锁的状态为有写锁的状态时,阻塞针对所述读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。

5.一种读写锁控制装置,其特征在于,包括:检测模块,用于在接收到针对读写锁的写锁获取请求时,检测所述读写锁的状态,其中,所述读写锁包括写锁、第一读锁以及第二读锁;

第一阻塞模块,用于在检测到所述读写锁处于有第一读锁的状态时,阻塞针对所述读写锁的写锁获取请求以及第一读锁获取请求;

第一放行模块,用于放行针对所述读写锁的第二读锁获取请求。

6.根据权利要求5所述的装置,其特征在于,所述装置还包括:第二阻塞模块,用于在检测到所述读写锁处于没有第一读锁,而有第二读锁的状态时,阻塞针对所述读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求。

7.根据权利要求5所述的装置,其特征在于,所述装置还包括:第二放行模块,用于在检测到所述读写锁处于没有第一读锁、第二读锁及写锁的状态时,放行当前的写锁获取请求,将所述读写锁的状态变为有写锁的状态;

执行模块,用于执行与当前的写锁获取请求相关联的写操作。

8.根据权利要求7所述的装置,其特征在于,所述装置还包括:第三阻塞模块,用于当所述读写锁的状态为有写锁的状态时,阻塞针对所述读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。

9.一种读写锁控制装置,其特征在于,包括:处理器;

用于存储处理器可执行指令的存储器;

其中,所述处理器被配置为:执行权利要求1-4中任意一项所述的方法。

10.一种非临时性计算机可读存储介质,当所述存储介质中的指令由处理器执行时,使得处理器能够执行根据权利要求1-4中任意一项所述的方法。

说明书 :

读写锁控制方法及装置

技术领域

[0001] 本公开涉及计算机技术领域,尤其涉及一种读写锁控制方法及装置。

背景技术

[0002] 相关技术中,为了解决读写锁的饥饿(starvation)问题,一种读写锁(公平读写锁)被设计为在接收到写锁获取请求时,阻塞所有在该请求后的读锁获取请求以及写锁获取请求。然而,在当写锁获取请求之前的读操作中包括长时间读操作时(例如,相对短时间读操作耗时为几毫秒,相对长时间读操作耗时为几百毫秒),该写锁获取请求等待的过程中,部分被阻塞的读锁获取请求即使被放行,相应的读操作(相对短时间读操作)也可以很快完成(例如,在长时间读操作时间几百毫秒内,耗时几毫秒的读操作也可以同步完成),并不会造成读写锁的饥饿问题。
[0003] 可见,这种公平读写锁直接阻塞写锁获取请求后的所有读锁获取请求,降低了系统的并发性。

发明内容

[0004] 为克服相关技术中存在的问题,本公开提供一种读写锁控制方法及装置。
[0005] 根据本公开实施例的第一方面,提供一种读写锁控制方法,包括:
[0006] 在接收到针对读写锁的写锁获取请求时,检测所述读写锁的状态,其中,所述读写锁包括写锁、第一读锁以及第二读锁;
[0007] 在检测到所述读写锁处于有第一读锁的状态时,阻塞针对所述读写锁的写锁获取请求以及第一读锁获取请求;
[0008] 放行针对所述读写锁的第二读锁获取请求。
[0009] 对于以上方法,在一种可能的实现方式中,所述方法还包括:
[0010] 在检测到所述读写锁处于没有第一读锁,而有第二读锁的状态时,阻塞针对所述读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求。
[0011] 对于以上方法,在一种可能的实现方式中,所述方法还包括:
[0012] 在检测到所述读写锁处于没有第一读锁、第二读锁及写锁的状态时,放行当前的写锁获取请求,将所述读写锁的状态变为有写锁的状态;
[0013] 执行与当前的写锁获取请求相关联的写操作。
[0014] 对于以上方法,在一种可能的实现方式中,所述方法还包括:
[0015] 当所述读写锁的状态为有写锁的状态时,阻塞针对所述读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。
[0016] 根据本公开实施例的第二方面,提供一种读写锁控制装置,包括:
[0017] 检测模块,用于在接收到针对读写锁的写锁获取请求时,检测所述读写锁的状态,其中,所述读写锁包括写锁、第一读锁以及第二读锁;
[0018] 第一阻塞模块,用于在检测到所述读写锁处于有第一读锁的状态时,阻塞针对所述读写锁的写锁获取请求以及第一读锁获取请求;
[0019] 第一放行模块,用于放行针对所述读写锁的第二读锁获取请求。
[0020] 对于以上装置,在一种可能的实现方式中,所述装置还包括:
[0021] 第二阻塞模块,用于在检测到所述读写锁处于没有第一读锁,而有第二读锁的状态时,阻塞针对所述读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求。
[0022] 对于以上装置,在一种可能的实现方式中,所述装置还包括:
[0023] 第二放行模块,用于在检测到所述读写锁处于没有第一读锁、第二读锁及写锁的状态时,放行当前的写锁获取请求,将所述读写锁的状态变为有写锁的状态;
[0024] 执行模块,用于执行与当前的写锁获取请求相关联的写操作。
[0025] 对于以上装置,在一种可能的实现方式中,所述装置还包括:
[0026] 第三阻塞模块,用于当所述读写锁的状态为有写锁的状态时,阻塞针对所述读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。
[0027] 根据本公开实施例的第三方面,提供一种读写锁控制装置,包括:
[0028] 处理器;
[0029] 用于存储处理器可执行指令的存储器;
[0030] 其中,所述处理器被配置为执行上述方法。
[0031] 根据本公开实施例的第四方面,提供一种非临时性计算机可读存储介质,当所述存储介质中的指令由处理器执行时,使得处理器能够执行上述读写锁控制方法。
[0032] 本公开的实施例提供的技术方案可以包括以下有益效果:通过在接收到针对读写锁的写锁获取请求时,并在检测到读写锁处于有第一读锁的状态时,阻塞针对该读写锁的写锁获取请求以及第一读锁获取请求,放行针对读写锁的第二读锁获取请求,从而实现一种能够提高系统并发性的读写锁。
[0033] 应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。

附图说明

[0034] 此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
[0035] 图1是根据一示例性实施例示出的一种读写锁控制方法的流程图。
[0036] 图2是根据一示例性实施例示出的一种读写锁控制方法的流程图。
[0037] 图3是根据一示例性实施例示出的一种读写锁控制方法的流程图。
[0038] 图4是根据一示例性实施例示出的一种读写锁控制方法的流程图。
[0039] 图5是根据一示例性实施例示出的一种读写锁控制方法的应用场景的示意图。
[0040] 图6是根据一示例性实施例示出的一种读写锁控制装置的框图。
[0041] 图7是根据一示例性实施例示出的一种读写锁控制装置的框图。
[0042] 图8是根据一示例性实施例示出的一种读写锁控制装置的框图。

具体实施方式

[0043] 这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
[0044] 锁是多线程应用程序的基本同步机制。读写锁将对资源的访问者划分为写者和读者,其中,发起写锁获取请求的为写者,写者对资源进行写操作,发起读锁获取请求的为读者,读者对资源进行读操作。
[0045] 读写锁允许同时有多个读者对资源进行读操作(多个读操作可以同时处于临界区),仅允许一个写者对资源进行写操作(一个写操作处于临界区)。一个读写锁同时只能有一个写者或多个读者,不能同时既有读者又有写者。对于读写锁,如果在前面的读者释放锁之前,一直有新的读者发起读锁获取请求,并进入到临界区,则读锁不会被释放,从而导致在后面等待的写者一直无法获取写锁,导致饥饿问题。
[0046] 为了解决读写锁的饥饿问题,设计了一种公平读写锁。在公平读写锁中,在写者试图获取读写锁时(发起写锁获取请求),会阻塞所有在该请求后的所有读锁获取请求以及写锁获取请求,以避免读写锁的饥饿问题。然而,多个读者读操作的操作时间存在差别,有的读者读操作需要的操作时间较长,而有的读者读操作需要的操作时间较短。在公平读写锁中,在写者试图获取读写锁时,直接阻塞该写者之后的所有读者的读锁获取请求,而并未对读操作的操作时间明显存在差别的读者的读锁获取请求进行区分,降低了系统的并发性。
[0047] 图1是根据一示例性实施例示出的一种读写锁控制方法的流程图。如图1所示,该方法用于服务器中。根据本公开实施例的读写锁控制方法包括:
[0048] 在步骤S101中,在接收到针对读写锁的写锁获取请求时,检测所述读写锁的状态,其中,所述读写锁包括写锁、第一读锁以及第二读锁;
[0049] 在步骤S102中,在检测到所述读写锁处于有第一读锁的状态时,阻塞针对所述读写锁的写锁获取请求以及第一读锁获取请求;
[0050] 在步骤S103中,放行针对所述读写锁的第二读锁获取请求。
[0051] 根据本公开的实施例,通过在接收到针对读写锁的写锁获取请求时,并在检测到读写锁处于有第一读锁的状态时,阻塞针对该读写锁的写锁获取请求以及第一读锁获取请求,放行针对读写锁的第二读锁获取请求,从而实现一种能够提高系统并发性的读写锁。
[0052] 举例来说,可以将读写锁设置成包括写锁、第一读锁(操作时间较长(例如几百毫秒)的读锁)以及第二读锁(操作时间较短(例如几毫秒~几十毫秒)的读锁)。在接收到针对读写锁的写锁获取请求时,可以检测该读写锁的状态。如果检测到该读写锁处于有第一读锁的状态时,则可以阻塞针对该读写锁的写锁获取请求以及第一读锁获取请求,并放行针对该读写锁的第二读锁获取请求。例如,在接收到写锁获取请求A1之前,有读者发起第一读锁获取请求B1,并被放行进入临界区,此时该读写锁处于有第一读锁b1的状态(此时,该读写锁也可能有第二读锁),阻塞针对该读写锁的写锁获取请求A1。在接收到写锁获取请求A1之后,还可能接收到针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。在检测到该读写锁的第一读锁b1没有被释放之前,可以阻塞写锁获取请求A1之后接收到的针对该读写锁的第一读锁获取请求以及写锁获取请求,放行第二读锁获取请求(例如,阻塞针对该读写锁的写锁获取请求A1之后接收到的第一读锁获取请求B2以及写锁获取请求A2等,放行第二读锁获取请求C1、C2等)。
[0053] 通过这种方式,在接收到写锁获取请求,且读写锁处于有第一读锁的状态时,阻塞针对该读写锁的写锁获取请求以及第一读锁获取请求,放行该写锁获取请求之后接收到的第二读锁获取请求(对应的读操作时间较短),可以提高系统的并发性。本领域技术人员应理解,可以采用多种方式检测读写锁的状态,可以采用相关技术实现对针对读写锁的写锁获取请求以及第一读锁获取请求的阻塞和对第二读锁获取请求的放行,本公开对此不作限制。
[0054] 图2是根据一示例性实施例示出的一种读写锁控制方法的流程图。在一种可能的实现方式中,如图2所示,该方法还包括:
[0055] 在步骤S104中,在检测到所述读写锁处于没有第一读锁,而有第二读锁的状态时,阻塞针对所述读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求。
[0056] 在一种可能的实现方式中,如前文所述,在接收到针对该读写锁的写锁获取请求时(步骤S101),该读写锁处于有第一读锁的状态,并放行了针对该读写锁的第二读锁获取请求(步骤S102、步骤S103)。在该第一读锁执行完毕被释放之后(离开临界区),该读写锁还可能有第二读锁,此时,可以检测到该读写锁处于没有第一读锁,而有第二读锁的状态(步骤S104)。
[0057] 举例来说,在该读写锁处于有第一读锁b1的状态时,阻塞了写锁获取请求A1、写锁获取请求A2以及第一读锁获取请求B2,放行了第二读锁获取请求C1、C2等。在第一读锁b1被释放之后,如果检测到该读写锁处于没有第一读锁,而有第二读锁(例如,之前第二读锁c1执行完毕并被释放,第二读锁c2没有执行完毕),则可以阻塞针对该读写锁的写锁获取请求A1,还阻塞该写锁获取请求A1之后接收的针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求(例如,第一读锁获取请求B2、第二读锁获取请求C3以及写锁获取请求A2等)。通过这种方式,可以避免该读写锁出现饥饿问题。
[0058] 在一种可能的实现方式中,在接收到针对该读写锁的写锁获取请求时(步骤S101),也可能检测到该读写锁处于没有第一读锁,而有第二读锁的状态(步骤S104)。
[0059] 举例来说,在接收到针对读写锁的写锁获取请求A1时,可以检测该读写锁的状态。如果检测到该读写锁处于没有第一读锁,而有第二读锁的状态,则可以阻塞针对该读写锁的写锁获取请求A1。在接收到写锁获取请求A1之后,还可能接收到针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。在读写锁处于没有第一读锁,而有第二读锁的状态时,还阻塞写锁获取请求A1之后接收到的针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求(例如,第一读锁获取请求B2、第二读锁获取请求C1、C2以及写锁获取请求A2等)。
[0060] 通过这种方式,可以避免该读写锁出现饥饿问题。本领域技术人员应理解,可以采用多种方式检测读写锁的状态,可以采用相关技术实现对针对读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求的阻塞,本公开对此不作限制。
[0061] 图3是根据一示例性实施例示出的一种读写锁控制方法的流程图。在一种可能的实现方式中,如图3所示,该方法还包括:
[0062] 在步骤S105中,在检测到所述读写锁处于没有第一读锁、第二读锁及写锁的状态时,放行当前的写锁获取请求,将所述读写锁的状态变为有写锁的状态;
[0063] 在步骤S106中,执行与当前的写锁获取请求相关联的写操作。
[0064] 在一种可能的实现方式中,如前文所述,在接收到针对该读写锁的写锁获取请求后(步骤S101),可以检测到该读写锁可以处于没有第一读锁,而有第二读锁的状态,并阻塞针对该读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求(步骤S104)。在第二读锁全部被释放之后,可以检测到该读写锁处于没有第一读锁、第二读锁及写锁的状态(步骤S105)。
[0065] 举例来说,在接收到写锁获取请求A1后,如果检测到该读写锁处于没有第一读锁,而有第二读锁(例如,第二读锁c2)的状态,则阻塞该写锁获取请求A1。并阻塞在该写锁获取请求A1之后接收到的针对该读写锁的第一读锁获取请求B2、第二读锁获取请求C3以及写锁获取请求A2等。在第二读锁c2被释放之后,可以检测到该读写锁没有第一读锁、第二读锁以及写锁的状态(临界区内的第一读锁和第二读锁都被释放,写锁获取请求A1以及写锁获取请求A1之后接收到的第一读锁获取请求、第二读锁获取请求以及写锁获取请求都被阻塞)。此时,可以放行当前的写锁获取请求A1,将所述读写锁的状态变为有写锁的状态。相应的写者进入临界区,执行与当前的写锁获取请求相关联的写操作。通过这种方式,实现了对写锁获取请求的及时响应,避免了读写锁的饥饿。
[0066] 在一种可能的实现方式中,在接收到针对读写锁的写锁获取请求时(步骤S101),也可能检测到该读写锁处于没有第一读锁、第二读锁及写锁的状态(步骤S105)。
[0067] 举例来说,在接收到针对读写锁的写锁获取请求A1时,检测该读写锁的状态。如果检测到该读写锁处于没有第一读锁、第二读锁以及写锁的状态(例如,恰好所有第一读锁、第二读锁都在接收到写锁获取请求A1时都被释放,且没有第一读锁获取请求、第二读锁获取请求或写锁获取请求进入临界区),则可以放行当前的写锁获取请求A1,将所述读写锁的状态变为有写锁的状态。相应的写者进入临界区,执行与当前的写锁获取请求相关联的写操作。
[0068] 通过这种方式,实现了对写锁获取请求的及时响应,避免了读写锁的饥饿。本领域技术人员应理解,可以采用多种方式检测读写锁的状态,可以采用相关技术实现对针对读写锁的写锁获取请求的放行,本公开对此不作限制。
[0069] 图4是根据一示例性实施例示出的一种读写锁控制方法的流程图。在一种可能的实现方式中,如图4所示,该方法还包括:
[0070] 在步骤S107中,当所述读写锁的状态为有写锁的状态时,阻塞针对所述读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。
[0071] 在一种可能的实现方式中,如前文所述,在读写锁的状态变为有写锁的状态时,可以阻塞针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。
[0072] 举例来说,在放行写锁获取请求A1之后,该读写锁的状态变为有写锁的状态(步骤S105),并执行与写锁获取请求A1相关联的写操作(步骤S106)。此时,在该读写锁的状态为有写锁的状态时,阻塞针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求(步骤S107)。例如,可以阻塞写锁获取请求A1之后接收到的写锁获取请求A2、第一读锁获取请求B2以及第二读锁获取请求C3等。
[0073] 在一种可能的实现方式中,在接收到针对读写锁的写锁获取请求时(步骤S101),可能检测到该读写锁处于有写锁的状态(步骤S107)。
[0074] 举例来说,在接收到针对读写锁的写锁获取请求A1时,可以检测该读写锁的状态。如果该读写锁处于有写锁的状态时,例如,该读写锁处于有写锁a3的状态时,则可以阻塞针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。例如,可以阻塞写锁获取请求A1以及写锁获取请求A1之后接收到的写锁获取请求A2、第一读锁获取请求B2以及第二读锁获取请求C3等。
[0075] 通过这种方式,可以保证读写锁的临界区内仅有一个写者进行写操作,实现读操作和写操作的分离。本领域技术人员应理解,可以采用多种方式检测读写锁的状态,可以采用相关技术实现对针对读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求的阻塞,本公开对此不作限制。
[0076] 应用示例
[0077] 以下结合“多线程应用获取读写锁”作为一个示例性应用场景,给出根据本公开实施例的应用示例,以便于理解读写锁控制方法的流程。本领域技术人员应理解,以下应用示例仅仅是出于便于理解本公开实施例的目的,不应视为对本公开实施例的限制。
[0078] 图5是根据一示例性实施例示出的一种读写锁控制方法的应用场景的示意图。如图5所示,在该应用示例中,多线程应用程序获取读写锁。
[0079] 在该应用示例中,在接收到针对读写锁的写锁获取请求时,可以检测该读写锁的状态(步骤501)。在检测到该读写锁处于有第一读锁的状态时,阻塞该写锁获取请求以及该写锁获取请求之后接收到的第一读锁获取请求(步骤502)。放行该写锁获取请求之后接收到的第二读锁获取请求(步骤503)。例如,在接收到针对读写锁的写锁获取请求A1时,检测到该读写锁处于有第一读锁b1的状态时,阻塞该写锁获取请求A1。在第一读锁b1没有被释放之前,阻塞该写锁获取请求A1之后接收到的针对该读写锁的第一读锁获取请求以及写锁获取请求(例如,第一读锁获取请求B2、写锁获取请求A2等),并放行该写锁获取请求A1之后接收到的第二读锁获取请求(例如,第二读锁获取请求C1、C2等)。
[0080] 在该应用示例中,在第一读锁b1被释放之后(例如,离开临界区),检测到该读写锁处于没有第一读锁,而有第二读锁时(例如,之前第二读锁c1执行完毕并被释放,第二读锁c2没有执行完毕),继续阻塞该写锁获取请求A1,并且阻塞该写锁获取请求A1之后接收到的第一读锁获取请求、第二读锁获取请求以及写锁获取请求(步骤504)。例如,阻塞该写锁获取请求A1以及该写锁获取请求A1之后接收到的针对该读写锁的第一读锁获取请求B2、写锁获取请求A2以及第二读锁获取请求C3等。
[0081] 在该应用示例中,在检测到该读写锁处于没有第一读锁、第二读锁以及写锁时(例如,第二读锁c2也执行完毕,被释放),此时,放行该写锁获取请求A1,并将该读写锁的状态变为有写锁的状态(步骤505)。并执行与该写锁获取请求A1相关联的写操作(步骤506)。在该应用示例中,该读写锁的状态为有写锁的状态,阻塞写锁获取请求A1之后接收到的第一读锁获取请求、第二读锁获取请求以及写锁获取请求(步骤507)。例如,阻塞该写锁获取请求A1之后接收到的针对该读写锁的第一读锁获取请求B2、第二读锁获取请求C3以及写锁获取请求A2等。
[0082] 在该应用示例中,在接收到写锁获取请求时,可以检测该读写锁的状态。例如,如果检测到该读写锁处于没有第一读锁,而有第二读锁的状态时,则阻塞针对该读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求(步骤504)。例如,在接收到写锁获取请求A1时,如果检测到该读写锁处于没有第一读锁,而有第二读锁的状态(例如,有第二读锁c1、c2),则阻塞该写锁获取请求A1,并阻塞该写锁获取请求A1之后接收到的写锁获取请求、第一读锁获取请求以及第二读锁获取请求(例如,写锁获取请求A2、第一读锁获取请求B2以及第二读锁获取请求C3)。
[0083] 在该应用示例中,在接收到写锁获取请求时,可以检测该读写锁的状态。例如,如果检测到该读写锁处于没有第一读锁、第二读锁以及写锁的状态时,则放行该写锁获取请求,将该读写锁的状态变为有写锁的状态(步骤505)。并执行与当前的写锁获取请求相关联的写操作(步骤506)。例如,在接收到写锁获取请求A1时,如果检测到该读写锁处于没有第一读锁、第二读锁以及写锁的状态时,则可以放行该写锁获取请求A1,将该读写锁的状态变为有写锁的状态,并执行与当前的写锁获取请求A1相关联的写操作。
[0084] 在该应用示例中,在接收到写锁获取请求时,可以检测该读写锁的状态。例如,如果检测到该读写锁有写锁的状态时,则可以阻塞针对该读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求(步骤507)。例如,在接收到写锁获取请求A1时,如果检测到该读写锁处于有写锁(例如写锁a3)的状态,此时,可以阻塞针对该读写锁的写锁获取请求A1。并阻塞该写锁获取请求A1之后接收到的第一读锁获取请求、第二读锁获取请求以及写锁获取请求(例如,第一读锁获取请求B2、第二读锁获取请求C3以及写锁获取请求A2等)。
[0085] 根据本公开的实施例,通过在接收到针对读写锁的写锁获取请求时,并在检测到读写锁处于有第一读锁的状态时,阻塞针对该读写锁的写锁获取请求以及第一读锁获取请求,放行针对读写锁的第二读锁获取请求,从而实现一种提高系统并发性的读写锁。
[0086] 图6是根据一示例性实施例示出的一种读写锁控制装置的框图。参照图6,该装置包括检测模块601,第一阻塞模块602和第一放行模块603。
[0087] 该检测模块601,被配置为在接收到针对读写锁的写锁获取请求时,检测所述读写锁的状态,其中,所述读写锁包括写锁、第一读锁以及第二读锁;
[0088] 该第一阻塞模块602,被配置为在检测到所述读写锁处于有第一读锁的状态时,阻塞针对所述读写锁的写锁获取请求以及第一读锁获取请求;
[0089] 该第一放行模块603,被配置为放行针对所述读写锁的第二读锁获取请求。
[0090] 图7是根据一示例性实施例示出的一种读写锁控制装置的框图。参照图7,在一种可能的实现方式中,所述装置还包括:
[0091] 第二阻塞模块604,被配置为在检测到所述读写锁处于没有第一读锁,而有第二读锁的状态时,阻塞针对所述读写锁的写锁获取请求、第一读锁获取请求以及第二读锁获取请求。
[0092] 参照图7,在一种可能的实现方式中,所述装置还包括:
[0093] 第二放行模块605,被配置为在检测到所述读写锁处于没有第一读锁、第二读锁及写锁的状态时,放行当前的写锁获取请求,将所述读写锁的状态变为有写锁的状态;
[0094] 执行模块606,被配置为执行与当前的写锁获取请求相关联的写操作。
[0095] 参照图7,在一种可能的实现方式中,所述装置还包括:
[0096] 第三阻塞模块607,被配置为当所述读写锁的状态为有写锁的状态时,阻塞针对所述读写锁的第一读锁获取请求、第二读锁获取请求以及写锁获取请求。
[0097] 关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
[0098] 图8是根据一示例性实施例示出的一种读写锁控制装置的框图。例如,装置1900可以被提供为一服务器。参照图8,装置1900包括处理组件1922,其进一步包括一个或多个处理器,以及由存储器1932所代表的存储器资源,用于存储可由处理组件1922的执行的指令,例如应用程序。存储器1932中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件1922被配置为执行指令,以执行上述方法。
[0099] 装置1900还可以包括一个电源组件1926被配置为执行装置1900的电源管理,一个有线或无线网络接口1950被配置为将装置1900连接到网络,和一个输入输出(I/O)接口1958。装置1900可以操作基于存储在存储器1932的操作系统,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM或类似。
[0100] 在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器1932,上述指令可由装置1900的处理组件1922执行以完成上述方法。例如,所述非临时性计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
[0101] 本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本申请旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
[0102] 应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。