CN107807858A - 一种读写锁操作方法及***、设备 - Google Patents
一种读写锁操作方法及***、设备 Download PDFInfo
- Publication number
- CN107807858A CN107807858A CN201711034237.1A CN201711034237A CN107807858A CN 107807858 A CN107807858 A CN 107807858A CN 201711034237 A CN201711034237 A CN 201711034237A CN 107807858 A CN107807858 A CN 107807858A
- Authority
- CN
- China
- Prior art keywords
- data
- read
- lock
- write
- thread
- 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.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种读写锁操作方法及***、设备,用于提高执行效率。其中,读写锁操作方法包括:对数据执行读操作或写操作前,读取读写锁的锁标识;其中,所述锁标识用于指示所述读写锁的使用状态,所述锁标识包括第一部分和第二部分,所述第一部分用于指示当前是否存在线程对数据进行写操作,所述第二部分用于指示当前是否存在线程对数据进行读操作;根据读取的锁标识中的第一部分和第二部分判断所述读写锁的线程是否对所述数据存在读或者写操作;若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,或,若存在线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加锁操作或解锁操作。
Description
技术领域
本发明涉及操作***技术领域,特别涉及一种读写锁操作方法及***、设备。
背景技术
读写锁是一种自旋锁,它把共享资源的访问用户划分成读用户和写用户,读用户只对共享资源进行读操作,写用户则对共享资源进行写操作。一个读写锁同时只能有一个写用户或多个读用户,但不能同时既有读用户又有写用户。在多处理器***中,允许同时有多个读用户来访问共享资源,在读操作加锁时,写操作被阻塞。当处于写加锁时,所有试图读写资源的操作将被阻塞。
而进行读操作或写操作是通过线程实现的,在引入线程的操作***中,可以将线程作为独立运行和独立调度的基本单位。多个线程可以并发执行,为了避免同一数据在被修改时,其他线程也对该数据进行修改;或者,因为数据正在被修改而导致数据不能读。在线程对数据进行读操作或写操作的过程中,对该数据进行加锁,在执行完读写操作后,再对该数据进行解锁。
线程对数据实现加锁或解锁,也就是对***总线进行加锁或解锁,是通过为读线程设置的读标识和为写线程设置的写标识来实现的。对数据进行加锁,可以改变读标识或写标识,在下一个线程对该数据进行读操作或写操作之前,可以读取读标识或写标识,从而确定是否可以对该数据进行操作。也就是说对于任一线程,在对数据进行读操作或写操作之前,需要对总线加锁,获取总线的读标识或写标识,在确认可以对数据进行读操作或写操作时,再对总线进行加锁,以实现对数据的加锁。
可见,目前的读写锁操作方式在对数据进行加读锁时,至少需要两次对总线进行加锁。当存在多个线程运行的情况下,对总线加锁的次数较多,这就导致总线可以被使用的时间缩短,因此,***执行效率较低。
发明内容
本发明实施例提供一种读写锁操作方法及***、设备,用于提高执行效率。
第一方面,本发明一实施例提供了一种读写锁操作方法,该操作方法包括:
对数据执行读操作或写操作前,读取读写锁的锁标识;其中,所述锁标识用于指示所述读写锁的使用状态,所述锁标识包括第一部分和第二部分,所述第一部分用于指示当前是否存在线程对数据进行写操作,所述第二部分用于指示当前是否存在线程对数据进行读操作;
根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作;
若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,或,若存在线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加锁操作或解锁操作。
可选的,若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,包括:
若确定所述前线程对所述数据执行读操作,所述当前线程以所述锁标识对所述数据进行加读锁操作,其中,在所述前线程对所述数据读操作完成后,所述当前线程以所述锁标识对所述数据进行解读锁操作。
可选的,若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,包括:
若确定所述当前线程对所述数据执行写操作,则判断确定当前没有其他线程对所述数据进行读操作;
若确定当前没有其他线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加写锁操作;其中,在所述当前线程对所述数据写操作完成后,所述当前线程以所述锁标识对所述数据进行解写锁操作。
可选的,所述锁标识为整型数据,其中,所述第一部分为所述整型数据的最高位,所述第二部分为所述整型数据的其余位。
可选的,根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作,包括:
获取所述读取的锁标识中的第一部分;
若所述第一部分对应的标志位置为1,则确定当前存在线程对所述数据存在写操作。
可选的,根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作,包括:
使用0x80000000与所述锁标识进行相与运算,获得运算结果;
若所述运算结果为1,则确定当前存在线程对所述数据存在写操作。
可选的,若确定所述当前线程对所述数据执行写操作,则判断确定当前没有其他线程对所述数据进行读操作,包括:
获取所述读取的锁标识;
若所述第二部分大于0,则确定存在所述其他线程对所述数据进行读操作。
第二方面,本发明一实施例提供了一种读写锁操作***,该操作***包括:
读取单元,用于对数据执行读操作或写操作前,读取读写锁的锁标识;其中,所述锁标识用于指示所述读写锁的使用状态,所述锁标识包括第一部分和第二部分,所述第一部分用于指示当前是否存在线程对数据进行写操作,所述第二部分用于指示当前是否存在线程对数据进行读操作;
判断单元,用于根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作;
操作单元,用于若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,或,若存在线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加锁操作或解锁操作。
可选的,操作单元具体用于:
若确定所述前线程对所述数据执行读操作,所述当前线程以所述锁标识对所述数据进行加读锁操作,其中,在所述前线程对所述数据读操作完成后,所述当前线程以所述锁标识对所述数据进行解读锁操作。
可选的,操作单元具体用于:
若确定所述当前线程对所述数据执行写操作,则判断确定当前没有其他线程对所述数据进行读操作;
若确定当前没有其他线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加写锁操作;其中,在所述当前线程对所述数据写操作完成后,所述当前线程以所述锁标识对所述数据进行解写锁操作。
可选的,所述锁标识为整型数据,其中,所述第一部分为所述整型数据的最高位,所述第二部分为所述整型数据的其余位。
可选的,判断单元具体用于:
获取所述读取的锁标识中的第一部分;
若所述第一部分对应的标志位置为1,则确定当前存在线程对所述数据存在写操作。
可选的,判断单元具体用于:
使用0x80000000与所述锁标识进行相与运算,获得运算结果;
若所述运算结果为1,则确定当前存在线程对所述数据存在写操作。
可选的,判断单元具体用于:
获取所述读取的锁标识;
若所述第二部分大于0,则确定存在其他线程对所述数据进行读操作。
第三方面,本发明一实施例提供了一种读写锁操作设备,该操作设备包括:
至少一个处理器,以及
与所述至少一个处理器连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述至少一个处理器通过执行所述存储器存储的指令,执行如第一方面任一项所述的方法。
第四方面,本发明一实施例提供了一种计算机存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面提供的方法中任一项所述方法。
本发明实施例提供了一种新的读写锁操作方法,锁标识包括第一部分和第二部分,其中,第一部分用于指示读写锁是否处于写状态,第二部分用于指示读写锁是否处于读状态。读写锁的线程在对数据执行读操作或写操作前,读取一次读写锁的锁标识,根据读取的锁标识就可以判断是否对数据进行加锁操作。而只读取一次读写锁的锁标识,只会对总线进行一次加锁操作,相较于现有技术中每次操作至少需要对总线进行两次加锁操作,显然对总线进行加锁操作的次数减少,即可以减少对数据进行加读锁操作或加写锁操作的时间,从而提高了加解锁的操作执行效率。
附图说明
图1是现有技术提供的读写锁操作方法的流程图;
图2为本发明实施例提供的一种读写锁操作方法的流程图;
图3为本发明实施例提供的一种读写锁操作方法的流程图;
图4为本发明实施例提供的读写锁操作***的一种结构示意图;
图5为本发明实施例提供的读写锁操作设备的一种结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
下面介绍本发明实施例的背景技术。
在引入线程的操作***中,多个线程并发执行时,往往需要访问同一数据。为了保证该数据的完整性,目前使用锁机制。例如,在线程对数据进行读操作的过程中为该数据加上“读锁”,在线程对数据进行写操作的过程中为该数据加上“写锁”。线程对一个数据进行读操作之前,先对该数据加读锁,读操作执行完毕后,再解读锁。同样地,线程对一个数据进行写操作之前,先对该数据加写锁,读操作执行完毕后,再解写锁。
线程对数据实现加锁或解锁,也就是对***总线进行加锁或解锁,是通过为读写锁设置的读标识和为写线程设置的写标识来实现的。对数据进行加锁,可以改变读标识或写标识,在下一个线程对该数据进行读操作或写操作之前,可以读取读标识或写标识,从而确定是否可以对该数据进行操作。也就是说对于任一线程,在对数据进行读操作或写操作之前,需要对总线加锁,获取总线的读标识或写标识,在确认可以对数据进行读操作或写操作时,在对总线进行加锁,以实现对数据的加锁。
为了便于理解,请参见图1,图1是现有技术提供的读写锁操作方法的流程图。
现有技术中,***为读写锁分别设置了读标识和写标识。以一个线程为例,该线程对数据进行写操作之前,首先对总线进行加锁,以使得其他线程都不能使用总线,此时获取为读写锁设置的读标识和写标识,解析获取的读标识和写标识,以判断是否存在对数据的读操作过程和写操作过程。在允许对数据进行读操作或写操作时,先对总线进行加锁,然后重新设置新的读标识或写标识。可见,这个过程中,由于读写锁的读标识和写标识是不同的两种标识,读写锁的线程在对数据进行加锁时,至少需要两次对总线进行加锁。当存在多个线程运行的情况下,对总线加锁的次数较多,这就导致总线可以被使用的时间缩短,***执行效率较低。
鉴于此,本发明实施例提供一种新的读写锁操作方法,读写锁操作***为读写锁设置了一个锁标识,这一个锁标识既可以指示读写锁的读标识,又可以指示读写锁的写标识。这样读写锁的线程在对数据执行读操作或写操作前,只需要读取一次读写锁的锁标识,就可以同时获得读标识和写标识,从而判断出是否允许对数据进行加锁操作。而只读取一次读写锁的锁标识,只会对总线进行一次加锁操作,相较于现有技术中每次操作至少需要对总线进行两次加锁操作,显然对总线进行加锁操作的次数减少。即可以减少对数据进行加读锁操作或加写锁操作的时间,从而提高了加解锁的操作执行效率。
下面结合说明书附图介绍本发明实施例提供的技术方案。
请参见图2,本发明实施例提供一种新的读写锁操作方法,该读写锁操作方法的流程描述如下。
S201:对数据执行读操作或写操作前,读取读写锁的锁标识;其中,锁标识用于指示读写锁的使用状态,锁标识包括第一部分和第二部分,第一部分用于指示当前是否存在线程对数据进行写操作,第二部分用于指示当前是否存在线程对数据进行读操作;
S202:根据读取的锁标识中的第一部分和第二部分判断是否存在线程对数据进行读或者写操作;
S203:若不存在线程对数据进行写操作,则当前线程以锁标识对数据进行加锁操作或解锁操作,或,若存在线程对数据进行读操作,则当前线程以锁标识对数据进行加锁操作或解锁操作。
本发明实施例中,对于引入多个线程的操作***,读写锁操作***可以为读写锁设置锁标识。读写锁操作***可以将设置的锁标识置于CPU对应的缓存中,CPU可以对应多个缓存,多个缓存中有的缓存的读写速度较快,有的缓存的读写速度相对较慢,本发明实施例中,读写锁操作***可以将锁标识设置在速度较快的CPU缓存中,以提高执行效率。当然,也可以将设置的锁标识设置在其他可能的缓存中,或者是其他读取速度与CPU原子操作速度相同量级存储器中,对此,本发明实施例不作限制。
现有技术中,读写锁操作***为读写锁分别设置了读标识和写标识,在当前线程对数据进行读操作或写操作之前,会判断有没有其他线程对该数据正在进行读操作或写操作。当前线程判断有没有其他线程对该数据正在进行读操作或写操作时,由于现有技术中,读写锁分别设有读标识和写锁标识,所以需要分别读取读标识和写标识这两种标识,每次读之前需要对总线进行加锁操作,这就导致总线加锁的次数较多,一旦总线处于加锁状态,其余的线程都不能使用总线,导致执行效率较低。
而本发明实施例中,读写锁操作***可以将读写锁的锁标识设置为一个标识,这一个标识既可以指示读写锁的读标识,又可以指示读写锁的写标识。设置的锁标识可以包括两个部分,例如第一部分和第二部分,其中,第一部分可以用于指示当前是否存在线程对数据进行写操作,也就是读写锁是否处于写状态,当读写锁处于写状态,可以认为存在线程正在对数据进行写操作。第二部分可以用于指示当前是否存在线程对数据进行读操作,也就是读写锁是否处于读状态,当读写锁处于读状态,可以认为存在线程正在对数据进行读操作。
可能的实施方式中,读写锁操作***为读写锁设置的锁标识可以为整型数据,其中,该整型数据的最高位可以是第一部分,该整型数据的其余位可以是第二部分。例如,该整型数据可以是32位整型数据,第一部分是该32位整型数据的最高位,例如锁标识可以是0x80000000,那么可以通过0x80000000的最高位来指示读写锁的写标识。同理,第二部分可以是该32位整型数据的除最高位的其余31位数字,通过32位整型数据的这31位数字来指示读写锁的读标识。
由于读写锁操作***为读写锁设置的锁标识既可以指示读写锁的读标识,又可以指示读写锁的写标识,因此当读写锁的当前线程对数据进行读操作或写操作之前,当前线程判断当前有没有其他线程对该数据正在进行读操作或写操作时,只需要读取一次锁标识就可以获知读标识和写标识,这就导致总线加锁的次数较少,从而提高执行效率。
本发明实施例中,读写锁的当前线程读取了锁标识之后,可以根据读取的锁标识中的第一部分和第二部分判断读写锁当前对应的其他线程是否对数据存在读操作或者写操作,以确定读写锁当前的线程是否可以对数据进行读操作或写操作。
可能的实施方式中,读写锁的当前线程读取了锁标识后,可以解析读取的锁标识,从读取的锁标识中获取第一部分,若第一部分对应的数字为1,也就是锁标识的最高位为1,则可以确定读写锁当前对应的其他线程对数据存在写操作。同样地,读写锁的当前线程可以从读取的锁标识中获取第二部分,若第二部分的数字全部不为0,也就是第二部分的31位数字只要有一位数字为1,则可以确定读写锁对应的其他线程对数据存在读操作。
或者,可能的实施方式中,读写锁的当前线程读取了锁标识后,可以从读取的锁标识中分别获取第一部分和第二部分,再对锁标识的第一部分置1,例如可以通过原子加操作实现,也就是自加1操作,然后将第一部分置1的锁标识与获取的第一部分进行相与运算,获得运算结果。如果该运算结果为1,则可以确定当前其他线程对数据存在写操作。如果该运算结果为0,则可以确定当前其他线程对数据不存在写操作。这样的方式,可以不必解析第一部分,只要获取了第一部分就执行与1的相与运算,较为方便。
在这种情况下,若确定有其他线程对数据存在写操作,那么此时读写锁的当前线程是不可以对数据进行写操作,也不可以对数据进行读操作,所以只要确定了有其他线程对数据存在写操作,则读写锁的当前线程等待其他线程对数据写操作完成。若确定有其他线程对数据不存在写操作,可以进一步判断其他线程是否对数据存在读操作。
可能的实施方式中,对第一部分和第二部分进行相与的运算,或者,使用0x80000000与所述锁标识进行相与运算,如果运算结果是0,则可以确定没有其他线程对数据进行读操作,如果运算结果大于0,则可以确定有其他线程对数据进行读操作。或者,读写锁的当前线程也可以获取读取的锁标识的第二部分,如果第二部分大于0,则可以确定当前有其他线程对数据进行读操作。如果第二部分为0,则可以确定当前没有其他线程对数据进行读操作。当有其他线程对数据进行读操作,若读写锁的当前线程是要对该数据进行读操作,那么读写锁的当前线程是可以对该数据进行读操作。
本发明实施例中,读写锁的当前线程确定了若其他线程对数据不存在读操作或写操作,可以以锁标识对数据进行加锁操作或解锁操作,具体可以有以下几种情况。
第一种情况:若确定当前没有其他线程对数据进行写操作,且当前线程对数据执行读操作,此时当前线程可以对数据执行读操作,在对数据进行读操作之前,可以以锁标识对数据进行加读锁操作,例如,可以对锁标识执行原子加1操作,实现对数据进行加读锁的目的。在当前线程对数据执行读操作完成后,可以对数据进行解读锁操作,例如可以对锁标识执行原子减1操作,实现对数据进行解读锁的目的。
第二种情况:若确定当前没有其他线程对数据进行写操作,且当前线程对数据执行写操作,则确定当前没有其他线程对数据进行读操作,若确定当前没有其他线程对数据进行读操作,则以锁标识对数据进行加写锁操作。由于读写锁的当前线程只能在确定当前没有其他线程对数据进行读操作和写操作的情况下,才可以对数据进行写操作。读写锁的当前线程在对数据进行写操作之前,可以以锁标识对数据进行加写锁操作,例如,可以对锁标识中的第一部分对应的标识位置1,实现对数据进行加写锁的目的。在当前线程对数据执行写操作完成后,可以对数据进行解写锁操作,例如可以对锁标识中的第一部分对应的标识位置0,实现对数据进行解写锁的目的。其中,对锁标识中的第一部分对应的标识位的设置可以通过调用原子交换函数__sync_val_compare_and_swap()实现。
另外,本发明实施例中,读线程通过__sync_add_and_fetch加1后确定当前有其他线程对数据进行写操作之后,可以对锁标识执行原子减1操作,并做随机延时处理,使得当前线程主动让出执行权,当有其他线程要对该数据进行读操作时,可以重新检查当前是否有线程对数据进行写操作。其中,随机延时处理可以通过函数sched_yield()实现,这样当前读线程随机延时会避免多个线程抢着访问数据的过程中,对总线进行频繁的加锁操作,延时过程中,可以让出CPU,使得CUP可以执行其他的调度,提高了执行效率。
为了便于理解,请参见图3,图3是本发明实施例提供的读写锁对数据进行加读锁流程示意图。图3中RET用于表示运算结果,FLAG用于表示锁标识,写标记位表示第一部分,也就是写标识。
从图3中可以看出,当读写锁的当前线程对数据进行读操作时,可以读取初始的FLAG,将读取的初始FLAG进行原子加1操作,与写标记位进行相与运算,得到运算结果,也就是RET,如果RET=0,则可以确定当前没有其他线程对数据进行写操作,此时读写锁的当前线程可以对数据进行读操作,,读操作完成后,可以对FLAG执行原子减1操作。如果此时读写锁的当前线程可以对数据进行写操作,在执行写操作前,可以将FLAG的第一部分的写标记位置1,执行完写操作后,将FLAG的第一部分的写标记位置0。
如果RET!=0,则可以确定当前有其他线程对数据进行写操作,此时读锁的当前线程不可以对数据进行读操作,也就是加读锁失败,此时继续对FLAG执行原子减1操作,并随机延时后,再次尝试对数据进行读操作,也就是对数据进行加读锁。当然,此时加写锁线程也不可以对数据进行写操作,也就是加写锁失败,此时随机延时后,再次尝试对数据进行写操作,也就是对数据进行加写锁。
从图3可以看出,读写锁的当前线程的读操作或写操作只会对总线加锁一次,从而减少了总线加锁的总次数,提高了执行效率。
基于本发明实施例提供的读写锁的操作方法,本发明实施例对操作***当前运行的多个线程的互斥情况做了测试,具体测试结果如表1所示。表1中pthread_rwlock_t用于表示现有技术中的操作类型,ns_rw_lock表示本发明实施例提供的操作类型。
表1
(多个线程运行的互斥情况)
从表1中,可以看出在只存在单线程的情况下,例如,只存在读线程的情况下,现有技术中的读写锁操作方法每秒每线程成功读次数是27983377,而本发明实施例提供的读写锁操作方法每秒每线程成功读次数是73558835,明显高于27983377。只存在写线程的情况下,现有技术中的读写锁操作方法每秒每线程成功写次数是31738777,而本发明实施例提供的读写锁操作方法每秒每线程成功写次数是73559008,明显高于31738777。可见,本发明实施例提供的读写锁操作方法能够执行更多的次数,执行效果更高。
在双线程互斥的情况下,只存在读线程的情况下,现有技术中的读写锁操作方法每秒每线程成功读次数是3905986,而本发明实施例提供的读写锁操作方法每秒每线程成功读次数是11654715,明显高于3905986。只存在写线程的情况下,现有技术中的读写锁操作方法每秒每线程成功写次数是2251103,而本发明实施例提供的读写锁操作方法每秒每线程成功写次数是29314940,明显高于2251103,是现有技术中的10倍左右。同时存在读、写线程的情况下,现有技术中的读写锁操作方法每秒每线程成功读次数是2239647,写数量是2213658。而本发明实施例提供的读写锁操作方法每秒每线程成功读次数是31273637,写数量是25287171,明显数量更多。可见,本发明实施例提供的读写锁操作方法能够执行更多的次数,执行效果更高。
在4线程互斥的情况下,只存在读线程的情况下,现有技术中的读写锁操作方法每秒每线程成功读次数是1551707,而本发明实施例提供的读写锁操作方法每秒每线程成功读次数是5219515,明显高于1551707。只存在写线程的情况下,现有技术中的读写锁操作方法每秒每线程成功写次数是658153,而本发明实施例提供的读写锁操作方法每秒每线程成功写次数是8774690,明显高于658153,是现有技术中的5倍左右。只存在读、写线程的情况下,现有技术中的读写锁操作方法每秒每线程成功读次数是986396,写线程的数量是970139。而本发明实施例提供的读写锁操作方法每秒每线程成功读次数是5621079,写线程的数量是4618247,明显数量更多。可见,本发明实施例提供的读写锁操作方法能够运行更多的线程,执行效率更高。
在实际工作中,以两个线程之间发生互斥居多,因此使用本发明实施例提供的方案,至少可以比现有技术中的加锁操作的速度快5-10倍,从而提高执行效率。
综上,本发明实施例提供了一种新的读写锁操作方法,锁标识包括第一部分和第二部分,其中,第一部分用于指示读写锁是否处于写状态,第二部分用于指示读写锁是否处于读状态。读写锁的线程在对数据执行读操作或写操作前,读取一次读写锁的锁标识,根据读取的锁标识就可以判断是否对数据进行加锁操作。而只读取一次读写锁的锁标识,只会对总线进行一次加锁操作,相较于现有技术中每次操作至少需要对总线进行两次加锁操作,显然对总线进行加锁操作的次数减少。即可以减少对数据进行加读锁操作或加写锁操作的时间,从而提高了加解锁的操作执行效率。
下面介绍本发明实施例提供的设备。
请参见图4,基于同一发明构思,本发明一实施例提供一种读写锁操作***,该操作***包括:
读取单元401,可以用于对数据执行读操作或写操作前,读取读写锁的锁标识;其中,锁标识用于指示读写锁的使用状态,锁标识包括第一部分和第二部分,第一部分用于指示当前是否存在线程对数据进行写操作,第二部分用于指示当前是否存在线程对数据进行读操作;
判断单元402,可以用于根据读取的锁标识中的第一部分和第二部分判断是否存在线程对数据进行读或者写操作;
操作单元403,可以用于则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,或,若存在线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加锁操作或解锁操作。
可选的,操作单元403具体用于:
若确定所述前线程对所述数据执行读操作,所述当前线程以所述锁标识对所述数据进行加读锁操作,其中,在所述前线程对所述数据读操作完成后,所述当前线程以所述锁标识对所述数据进行解读锁操作。
可选的,操作单元403具体用于:
若确定所述当前线程对所述数据执行写操作,则判断确定当前没有其他线程对所述数据进行读操作;
若确定当前没有其他线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加写锁操作;其中,在所述当前线程对所述数据写操作完成后,所述当前线程以所述锁标识对所述数据进行解写锁操作。
可选的,所述锁标识为整型数据,其中,所述第一部分为所述整型数据的最高位,所述第二部分为所述整型数据的其余位。
可选的,判断单元402具体用于:
获取读取的锁标识中的第一部分;
若第一部分对应的标志位置为1,则确定当前存在线程对数据存在写操作。
可选的,判断单元402具体用于:
使用0x80000000与所述锁标识进行相与运算,获得运算结果;
若运算结果为1,则确定当前存在线程对数据存在写操作。
可选的,判断单元402具体用于:
获取所述读取的锁标识;
若所述第二部分大于0,则确定存在其他线程对数据进行读操作。
该***可以用于执行图2或图3所示的实施例所提供的方法。因此,对于该***的各功能模块所能够实现的功能等可参考图2或图3所示的实施例的描述,不多赘述。
请参见图5,本发明一实施例还提供一种读写锁操作设备,该读写锁操作设备包括至少一个处理器501,处理器501用于执行存储器中存储的计算机程序时实现本发明实施例提供的如图2或图3所示的读写锁操作方法的步骤。
可选的,处理器501具体可以是中央处理器、特定应用集成电路(英文:Application Specific Integrated Circuit,简称:ASIC),可以是一个或多个用于控制程序执行的集成电路,可以是使用现场可编程门阵列(英文:Field Programmable GateArray,简称:FPGA)开发的硬件电路,可以是基带处理器。
可选的,该读写锁操作设备还包括与至少一个处理器501连接的存储器502,存储器502可以包括只读存储器(英文:Read Only Memory,简称:ROM)、随机存取存储器(英文:Random Access Memory,简称:RAM)和磁盘存储器。存储器502用于存储处理器501运行时所需的数据。存储器502的数量为一个或多个。其中,存储器502在图5中一并示出,但需要知道的是存储器302不是必选的功能模块,因此在图5中以虚线示出。
基于同一发明构思,本发明实施例提供一种计算机可读存储介质,该计算机可读存储介质存储有计算机指令,当计算机指令在计算机上运行时,使得计算机执行如图2或图3所示的方法。
在具体的实施过程中,计算机可读存储介质包括:通用串行总线闪存盘(Universal Serial Bus flash drive,USB)、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的存储介质。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的***,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:通用串行总线闪存盘(Universal Serial Bus flash disk)、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
1.一种读锁操作方法,其特征在于,包括:
对数据执行读操作或写操作前,读取读写锁的锁标识;其中,所述锁标识用于指示所述读写锁的使用状态,所述锁标识包括第一部分和第二部分,所述第一部分用于指示当前是否存在线程对数据进行写操作,所述第二部分用于指示当前是否存在线程对数据进行读操作;
根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作;
若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,或,若存在线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加锁操作或解锁操作。
2.如权利要求1所述的方法,其特征在于,若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,包括:
若确定所述当前线程对所述数据执行读操作,则所述当前线程以所述锁标识对所述数据进行加读锁操作,其中,在所述前线程对所述数据读操作完成后,所述当前线程以所述锁标识对所述数据进行解读锁操作。
3.如权利要求1所述的方法,其特征在于,若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,包括:
若确定所述当前线程对所述数据执行写操作,则判断确定当前没有其他线程对所述数据进行读操作;
若确定当前没有其他线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加写锁操作;其中,在所述当前线程对所述数据写操作完成后,所述当前线程以所述锁标识对所述数据进行解写锁操作。
4.如权利要求2或3所述的方法,其特征在于,所述锁标识为整型数据,其中,所述第一部分为所述整型数据的最高位,所述第二部分为所述整型数据的其余位。
5.如权利要求4所述的方法,其特征在于,根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作,包括:
获取所述读取的锁标识中的第一部分;
若所述第一部分对应的标志位置为1,则确定当前存在线程对所述数据存在写操作。
6.如权利要求4所述的方法,其特征在于,根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作,包括:
使用0x80000000与所述锁标识进行相与运算,获得运算结果;
若所述运算结果为1,则确定当前存在线程对所述数据存在写操作。
7.如权利要求4所述的方法,其特征在于,若确定所述当前线程对所述数据执行写操作,则判断确定当前没有其他线程对所述数据进行读操作,包括:
获取所述读取的锁标识;
若所述第二部分大于0,则确定存在其他线程对所述数据进行读操作。
8.一种读写锁操作***,其特征在于,包括:
读取单元401,用于对数据执行读操作或写操作前,读取读写锁的锁标识;其中,所述锁标识用于指示所述读写锁的使用状态,所述锁标识包括第一部分和第二部分,所述第一部分用于指示当前是否存在线程对数据进行写操作,所述第二部分用于指示当前是否存在线程对数据进行读操作;
判断单元402,用于根据读取的锁标识中的第一部分和第二部分判断是否存在线程对所述数据进行读或者写操作;
操作单元403,用于若不存在线程对所述数据进行写操作,则当前线程以所述锁标识对所述数据进行加锁操作或解锁操作,或,若存在线程对所述数据进行读操作,则所述当前线程以所述锁标识对所述数据进行加锁操作或解锁操作。
9.一种读写锁操作设备,其特征在于,包括:
至少一个处理器,以及
与所述至少一个处理器连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述至少一个处理器通过执行所述存储器存储的指令,执行如权利要求1-7中任一项所述的方法。
10.一种计算机存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行如权利要求1-7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711034237.1A CN107807858A (zh) | 2017-10-30 | 2017-10-30 | 一种读写锁操作方法及***、设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711034237.1A CN107807858A (zh) | 2017-10-30 | 2017-10-30 | 一种读写锁操作方法及***、设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107807858A true CN107807858A (zh) | 2018-03-16 |
Family
ID=61590865
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711034237.1A Pending CN107807858A (zh) | 2017-10-30 | 2017-10-30 | 一种读写锁操作方法及***、设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107807858A (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108446181A (zh) * | 2018-03-26 | 2018-08-24 | 武汉斗鱼网络科技有限公司 | 对资源限制访问的方法、装置及终端设备 |
CN109947575A (zh) * | 2019-03-21 | 2019-06-28 | 恒生电子股份有限公司 | 读写锁的加锁、释放方法及相关*** |
CN109976675A (zh) * | 2019-04-01 | 2019-07-05 | 广州市百果园信息技术有限公司 | 一种数据更新、读取方法、装置、设备及存储介质 |
CN110874273A (zh) * | 2018-08-31 | 2020-03-10 | 阿里巴巴集团控股有限公司 | 一种数据处理方法及装置 |
CN110908968A (zh) * | 2019-11-14 | 2020-03-24 | 浪潮电子信息产业股份有限公司 | 一种文件锁解锁时避免惊群的方法、装置、设备及存储介质 |
CN111104412A (zh) * | 2018-10-25 | 2020-05-05 | 阿里巴巴集团控股有限公司 | 基于单线程的并发控制方法、装置和*** |
CN111857545A (zh) * | 2019-04-28 | 2020-10-30 | 深信服科技股份有限公司 | 一种读写锁冲突判断方法、***、设备及计算机介质 |
CN111913810A (zh) * | 2020-07-28 | 2020-11-10 | 北京百度网讯科技有限公司 | 多线程场景下的任务执行方法、装置、设备和存储介质 |
CN112416556A (zh) * | 2020-11-23 | 2021-02-26 | 西安西热电站信息技术有限公司 | 一种数据读写优先平衡方法、***、装置及存储介质 |
CN113326215A (zh) * | 2021-07-04 | 2021-08-31 | 芯河半导体科技(无锡)有限公司 | 一种spi nor及nand闪存传输模式识别方法 |
CN113608716A (zh) * | 2021-08-13 | 2021-11-05 | 北京东方通网信科技有限公司 | 无锁数据队列方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100064280A1 (en) * | 2008-09-09 | 2010-03-11 | International Business Machines Corporation | Systems and methods for implementing test applications for systems using locks |
CN106557477A (zh) * | 2015-09-24 | 2017-04-05 | 伊姆西公司 | 在存储器中锁定文件的方法和设备 |
-
2017
- 2017-10-30 CN CN201711034237.1A patent/CN107807858A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100064280A1 (en) * | 2008-09-09 | 2010-03-11 | International Business Machines Corporation | Systems and methods for implementing test applications for systems using locks |
CN106557477A (zh) * | 2015-09-24 | 2017-04-05 | 伊姆西公司 | 在存储器中锁定文件的方法和设备 |
Non-Patent Citations (1)
Title |
---|
庞宏亮: ""基于NiosⅡ的同构多核处理器设计与FPGA实现"", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108446181A (zh) * | 2018-03-26 | 2018-08-24 | 武汉斗鱼网络科技有限公司 | 对资源限制访问的方法、装置及终端设备 |
CN110874273A (zh) * | 2018-08-31 | 2020-03-10 | 阿里巴巴集团控股有限公司 | 一种数据处理方法及装置 |
CN110874273B (zh) * | 2018-08-31 | 2023-06-13 | 阿里巴巴集团控股有限公司 | 一种数据处理方法及装置 |
CN111104412A (zh) * | 2018-10-25 | 2020-05-05 | 阿里巴巴集团控股有限公司 | 基于单线程的并发控制方法、装置和*** |
CN111104412B (zh) * | 2018-10-25 | 2023-05-30 | 阿里巴巴集团控股有限公司 | 基于单线程的并发控制方法、装置和*** |
CN109947575B (zh) * | 2019-03-21 | 2021-08-24 | 恒生电子股份有限公司 | 读写锁的加锁、释放方法及相关*** |
CN109947575A (zh) * | 2019-03-21 | 2019-06-28 | 恒生电子股份有限公司 | 读写锁的加锁、释放方法及相关*** |
CN109976675A (zh) * | 2019-04-01 | 2019-07-05 | 广州市百果园信息技术有限公司 | 一种数据更新、读取方法、装置、设备及存储介质 |
CN111857545A (zh) * | 2019-04-28 | 2020-10-30 | 深信服科技股份有限公司 | 一种读写锁冲突判断方法、***、设备及计算机介质 |
CN111857545B (zh) * | 2019-04-28 | 2023-12-29 | 深信服科技股份有限公司 | 一种读写锁冲突判断方法、***、设备及计算机介质 |
CN110908968A (zh) * | 2019-11-14 | 2020-03-24 | 浪潮电子信息产业股份有限公司 | 一种文件锁解锁时避免惊群的方法、装置、设备及存储介质 |
CN110908968B (zh) * | 2019-11-14 | 2022-05-27 | 浪潮电子信息产业股份有限公司 | 一种文件锁解锁时避免惊群的方法、装置、设备及存储介质 |
CN111913810A (zh) * | 2020-07-28 | 2020-11-10 | 北京百度网讯科技有限公司 | 多线程场景下的任务执行方法、装置、设备和存储介质 |
CN111913810B (zh) * | 2020-07-28 | 2024-03-19 | 阿波罗智能技术(北京)有限公司 | 多线程场景下的任务执行方法、装置、设备和存储介质 |
CN112416556B (zh) * | 2020-11-23 | 2023-10-20 | 西安西热电站信息技术有限公司 | 一种数据读写优先平衡方法、***、装置及存储介质 |
CN112416556A (zh) * | 2020-11-23 | 2021-02-26 | 西安西热电站信息技术有限公司 | 一种数据读写优先平衡方法、***、装置及存储介质 |
CN113326215A (zh) * | 2021-07-04 | 2021-08-31 | 芯河半导体科技(无锡)有限公司 | 一种spi nor及nand闪存传输模式识别方法 |
CN113326215B (zh) * | 2021-07-04 | 2024-01-19 | 芯河半导体科技(无锡)有限公司 | 一种spi nor及nand闪存传输模式识别方法 |
CN113608716B (zh) * | 2021-08-13 | 2022-03-22 | 北京东方通网信科技有限公司 | 无锁数据队列方法 |
CN113608716A (zh) * | 2021-08-13 | 2021-11-05 | 北京东方通网信科技有限公司 | 无锁数据队列方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107807858A (zh) | 一种读写锁操作方法及***、设备 | |
US10574545B2 (en) | Techniques for analytics-driven hybrid concurrency control in clouds | |
CN109815252A (zh) | 测试数据生成方法、装置、计算机设备及可读存储介质 | |
CN103092788B (zh) | 多核处理器及数据访问方法 | |
US20070005925A1 (en) | Methods for optimizing memory unit usage to maximize packet throughput for multi-processor multi-threaded architectures | |
CN107135078B (zh) | Pbkdf2密码算法加速方法及所用装置 | |
CN105511806B (zh) | 处理写请求的方法和移动终端 | |
CN106445631B (zh) | 一种布署虚拟机的方法、***以及物理服务器 | |
BR112019009566A2 (pt) | aparelhos e métodos para uma arquitetura de processador | |
CN106372008B (zh) | 一种数据缓存方法及装置 | |
US20110296437A1 (en) | Method and apparatus for lockless communication between cores in a multi-core processor | |
US9063929B2 (en) | Information processing apparatus, information processing method, computer-readable recording medium having stored therein program | |
CN103150159B (zh) | 使用命名对象的标识符生成 | |
CN111475494A (zh) | 一种海量数据处理方法、***、终端及存储介质 | |
CN113168364A (zh) | 一种芯片验证方法和装置 | |
CN109460406A (zh) | 一种数据处理方法及装置 | |
CN106933512B (zh) | 一种数据读写的方法及其设备 | |
CN103309676B (zh) | 用于海洋数值模拟ROMS的Web服务封装方法以及*** | |
CN103036947A (zh) | 基于kvm的虚拟机迁移方法及*** | |
CN109558241A (zh) | 一种获取自旋锁的方法及装置 | |
US20190065270A1 (en) | Methods and modules relating to allocation of host machines | |
CN115344302B (zh) | 用户态队列自旋锁生成方法、装置、电子设备及存储介质 | |
CN107643938A (zh) | 数据传输方法、装置及存储介质 | |
CN111310929A (zh) | 面向量子计算的数据交互设备、方法、装置及介质 | |
CN110334018A (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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20180316 |