具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例的附图,对本说明书实施例的技术方案清楚、完整地进行描述。显然,本说明书所描述的实施例仅仅是本申请的部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
现有技术中,散列表是一种常用的数据结构,广泛应用于数据处理领域。但是在建立散列表的过程中,若有多线程并行向散列表的同一地址写入数据,则其中一个线程向该地址写入数据时,会对该地址加锁,需要向该地址写入数据的其他线程必须排队等待该线程向该地址写入数据完成后,下一个线程才能访问该地址,即多个线程必须串行向该地址写入数据。如此一来,造成线程资源的浪费,使得需要耗费较长的时间和较多的计算资源才能建立散列表。
本说明书第一个实施例(以下简称“实施例一”)提供了一种无锁散列方法,实施例一的执行主体可以是终端(包括但不限于手机、计算机、pad、电视)或者服务器或者操作系统或者应用程序或者无锁散列平台或者无锁散列系统等,即执行主体可以是多种多样的,可以根据需要设置、使用或者变换执行主体。另外,也可以有第三方应用程序协助所述执行主体执行实施例一。例如图1所示,可以由服务器来执行实施例一中的无锁散列方法,并且可以在(用户所持有的)终端上安装(与所述服务器)相对应的应用程序,终端或应用程序与服务器之间可以进行数据传输,通过终端或应用程序来进行数据的采集或输入或输出或(向用户)进行页面或信息处理,从而辅助服务器执行实施例一中的无锁散列方法。
如图2所示,实施例一提供的无锁散列方法包括:
S101:(执行主体)获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;
实施例一的执行主体可以获取数据集合,数据集合中的数据是需要存储至散列表中的数据。实施例一的执行主体可以构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置(存储位置相当于存储地址或数组),每个存储位置都用于存储数据集合中的数据。
实施例一中,数据集合中的数据可以有基本的单位,例如以条或组为单位。具体如何划分数据单位,以及每个单位的数据包含的数据内容,实施例一不作具体限定。例如,数据集合中可以包含如下所示的用于表征三维模型(实施例一所述三维模型包括但不限于工业产品三维模型或人体三维模型,工业产品三维模型例如车辆、飞行工具等交通工具三维模型或工业机械三维模型、机床三维模型或其他通过工业生产得到的产品的三维模型)的点云数据:
0 0 0
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
3 0 1 2
3 0 1 4
3 0 2 3
3 1 4 5
3 0 3 4
3 2 3 6
3 1 5 2
3 4 5 6
3 3 4 7
3 3 6 7
3 2 5 6
3 4 6 7
上面的点云数据中,前8行中每一行的数据都代表点的坐标,故前8行的数据代表0-7(仅为示例)这8个点的坐标。第9至20每一行都代表由点构成的面,其中,每一行首位的数字3代表由三个点构成的面,即三角面片;每一行的后三位数字代表构成面的三个点的索引。例如“3 0 1 2”代表由点0、1、2构成的面,“3 0 1 4”代表由点0、1、4构成的面,以此类推。每一行数据都可以作为一个单位的数据。
以下将任一个单位的数据简称为任一数据或一个数据。
S103:(执行主体)对任一数据,对该数据进行散列,包括:对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的第一存储位置,判断所述第一存储位置是否正在存储数据;若所述第一存储位置正在存储数据,且所述第一存储位置已存储的数据与该数据相同,则更新所述第一存储位置对应的数据量;若所述第一存储位置已存储的数据与该数据不同,则将该数据存储至未存储数据的存储位置或将该数据存储至已存储与该数据相同的数据的第二存储位置;若所述第一存储位置未存储数据,则将该数据存储至所述第一存储位置;
对上述数据集合中的任一数据,实施例一的执行主体可以对该数据进行散列,即对该数据执行散列操作。对任一数据,对该数据进行散列可以包括:对任一数据,生成该数据对应的散列线程(即用于执行散列操作的线程),执行该数据对应的散列线程,以对该数据进行散列。
对任一数据,不妨称为数据A,下面进一步说明如何对数据A进行散列:
S1031:确定数据A对应的索引值;
其中,确定数据A对应的索引值可以包括:根据散列函数(哈希函数)确定数据A对应的索引值。例如,对于上述的任一行点云数据,可以将该行数据中的点的坐标作为参数或关键字,通过散列函数得到该行数据对应的唯一的整数,该整数作为该行数据对应的索引值。
S1033:根据所述索引值确定数据A对应的第一存储位置,判断所述第一存储位置是否正在存储数据;
根据数据A对应的索引值可以确定数据A对应的存储位置。其中,数据A对应的存储位置可以是“数据A对应的索引值”所对应的存储位置,具体是“以数据A对应的索引值为下标(或指针,下同)的存储位置”,数据A对应的存储位置不妨称为数据A的第一存储位置或首选存储位置。也就是说,数据A、数据A对应的索引值、数据A的第一存储位置是相互对应的。这样一来,通过数据A对应的索引值可以确定散列表中数据A的第一存储位置。
确定数据A的第一存储位置后,实施例一的执行主体或数据A对应的散列线程需要判断数据A的第一存储位置是否正在存储数据,即是否有其他线程正在将数据写入(写入相当于存储)数据A的第一存储位置。
S1035:若所述第一存储位置正在存储数据,且所述第一存储位置已存储的数据与该数据相同,则更新所述第一存储位置对应的数据量;若所述第一存储位置已存储的数据与该数据不同,则将该数据存储至未存储数据的存储位置或将该数据存储至已存储与该数据相同的数据的第二存储位置;若所述第一存储位置未存储数据,则将该数据存储至所述第一存储位置。
若数据A的第一存储位置未存储数据,则将数据A存储至其第一存储位置。以下不妨将存储有数据的存储位置称为非空存储位置或存储位置非空,未存储有数据的存储位置称为空存储位置或存储位置为空。
实际上,确定数据A的第一存储位置后,可能数据A的第一存储位置上已经存储有数据,下面分为1.1和1.2说明:
1.1、可能存在多个数据对应相同的索引值的情况,即可能存在索引值或第一存储位置的“碰撞”。由于每个数据都会有对应散列线程,就可能存在多个散列线程需要将其对应的数据写入散列表中的同一存储位置。一般的,数据集合中的数据可以具有顺序,从而按序对数据集合中的数据进行散列。这样一来,会出现对于对应相同的索引值或对应相同的第一存储位置的多个数据,在将排序靠后的数据存储至其对应的第一存储位置时,其对应的第一存储位置已存入排序靠前的数据的情况,故排序靠后的数据需要存储至其他存储位置。假设有任意的数据B和数据C,数据B的排序先于数据C,则数据B对应的散列线程对数据B进行散列,确定数据B对应的索引值和第一存储位置后,若数据B的第一存储位置为空,则将数据B存储至其第一存储位置。后续数据C对应的索引值若与数据B相同,则数据C需要存储至其他存储位置。
1.2、对于任意的数据D和数据E,数据D的排序先于数据E,则数据D对应的散列线程对数据D进行散列,确定数据D对应的索引值和第一存储位置后,若数据D的第一存储位置非空,则数据D需要存储至其他存储位置,故数据D有可能存储到数据E的第一存储位置,后续数据E需要存储至其存储位置以外其他存储位置。
需要说明的是,确定数据A的第一存储位置后,若数据A的第一存储位置非空,可能是其他散列线程已经将其对应数据存储至数据A的第一存储位置,也可能其他散列线程正在将其对应数据写入或存储至数据A的第一存储位置,即出现了其他散列线程与数据A对应的散列线程的线程冲突。若是其他散列线程正在将其对应数据写入或存储至数据A的第一存储位置,即使还没有写入完毕,只要已经将部分数据写入数据A的第一存储位置,仍视为数据A的第一存储位置已存储数据,已存储的数据即为已写入的所述部分数据。
确定数据A的第一存储位置后,若数据A的第一存储位置非空,则可以判断数据A的第一存储位置已写入(或已存储)的数据与数据A是否相同。若数据A的第一存储位置已写入的数据与数据A相同,则无需再将数据A存储至散列表,而是更新数据A的第一存储位置对应的数据量。其中,对任一存储位置,该存储位置对应的数据量即为该存储位置存储的数据量。具体的,该存储位置可以具有对应的参数,用于记录该存储位置对应的数据量。
数据量可以从1开始计数,若数据A的第一存储位置已写入的数据与数据A相同,则更新数据A的第一存储位置对应的数据量可以包括:将数据A的第一存储位置对应的数据量加1,如图3所示。可见,若数据A的第一存储位置已写入的数据与数据A相同,则并不需要将数据A存储至其第一存储位置,而是通过更新其第一存储位置对应的数据量,表征其第一存储位置存储了多少个数据A。
若数据A的第一存储位置已存储的数据与数据A不同,例如数据A的第一存储位置已存储数据A’,则需要将数据A存储至其第一存储位置以外的其他空存储位置或将数据A存储至其对应的第二存储位置,第二存储位置存储的数据与数据A相同。即数据A的实际存储位置可以是其第一存储位置以外的其他空存储位置或其第二存储位置,如图4所示。
其中,将数据A存储至其第一存储位置以外的其他空存储位置或将数据A存储至第二存储位置可以包括:从数据A的第一存储位置之后的首个存储位置开始,按照存储位置序号(即存储位置的下标)循环查找散列表中的存储位置(循环查找即查找到散列表的最后一个存储位置后,再从散列表的首个存储位置开始查找);若首先查找到一个存储有与数据A相同的数据的存储位置,即数据A的第二存储位置,则无需再将数据A存储至散列表,而是如上更新数据A的第二存储位置对应的数据量,并不再继续查找;若首先查找到一个空存储位置,则将数据A存储至查找到的该空存储位置,并不再继续查找。例如散列表有n个存储位置,数据A的第一存储位置为序号为m(n>m)的存储位置,若数据A的第一存储位置已写入的数据与数据A不同,则从序号为m+1的存储位置开始,按照存储位置序号循环查找散列表中的存储位置,将数据A存储至首先查找到的第二存储位置或空存储位置。
对于数据A来说,上述第二存储位置和第一存储位置可能不同,即散列表的不同存储位置可能存储有相同的数据,这一般是因为确定数据A的第一存储位置时,其第一存储位置正在存储数据但未存储完成造成的。下面通过示例说明散列表的不同存储位置可能存储有相同的数据的原因:
例如对于点云数据集,假设第f行和第g行数据都是点1和点2的坐标,第f行数据排序先于第g行数据。第f行数据对应的散列线程将第f行数据存储至第f行数据的第一存储位置(不妨记为存储位置h)过程中,第g行数据对应的散列线程确定第g行数据的第一存储位置是存储位置h。确定第g行数据的存储位置h时,第f行数据对应的散列线程已经将部分数据存储至存储位置h,例如已经将点1的坐标存储至存储位置h。由于第f行和第g行数据的存储位置相同,且存储位置h已非空,则第g行数据对应的散列线程将已存储至存储位置h的数据与第g行数据相比较,并判断已存储至存储位置h的数据(即上述点1的坐标)与第g行数据(即点1和点2的坐标)不同,从而第g行数据对应的散列线程将第g行数据存储至存储位置h以外的其他存储位置。第f行数据对应的散列线程将第f行数据全部存储至存储位置h后,散列表中就会有至少两个不同存储位置分别存储第f行和第g行数据,从而散列表的不同存储位置可能存储有相同的数据。
以上仅为示例。由上可知,对数据集合中的各个数据进行散列后,不仅散列表的不同存储位置可能存储有相同的数据,并且散列表中存储相同数据的不同位置对应的数据量也可能为1或大于1。
对于数据A来说,上述第二存储位置与第一存储位置可能相同,这是因为:在进行上述循环查找过程中,可能从数据A的第一存储位置之后的首个存储位置开始,直到数据A的第一存储位置的前一个存储位置,也未找到空存储位置或第二存储位置,而此时数据A的第一存储位置已完成数据存储,故再将数据A与数据A的第一存储位置的已存储数据比较,可能发现数据A的第一存储位置的已存储数据与数据A相同,故数据A的第一存储位置就成了首先查找到的第二存储位置,则更新数据A的第一存储位置对应的数据量,并不再继续查找,
以上内容相当于散列过程,散列过程中包含了初步查重过程,即上述的数据比较是初步查重过程。经过上述散列过程,数据集合中的各个数据都被存储到散列表中,只不过有些相同的数据是通过其实际存储位置对应的数据量来表征的。
S105:(执行主体)对所述数据集合中的所有数据进行散列后,对所述散列表进行查重,以使:对任一数据,若有多个不同存储位置存储该数据,则保留一个存储位置用于存储该数据,并根据存储该数据的所述多个不同存储位置对应的数据量,更新所保留的用于存储该数据的存储位置对应的数据量。
由于散列表的不同存储位置可能存储有相同的数据,故对所述数据集合中的所有数据进行散列后,实施例一的执行主体会对所述散列表进行查重。对所述散列表进行查重可以包括:对任一数据,若有多个不同存储位置存储该数据,则保留一个存储位置用于存储该数据,并根据存储该数据的所述多个不同存储位置对应的数据量,更新所保留的用于存储该数据的存储位置对应的数据量。其中,根据存储该数据的所述多个不同存储位置对应的数据量,更新所保留的用于存储该数据的存储位置对应的数据量可以包括:将存储该数据的所述多个不同存储位置对应的数据量之和,作为所保留的用于存储该数据的存储位置对应的数据量
仍将任一数据称为数据A,对散列表进行查重可以包括,若散列表中有多个不同存储位置存储有数据A,则保留这多个存储位置中的一个存储位置用于存储数据A,并更新所保留的用于存储数据A的存储位置对应的数据量。具体的,将这多个存储有数据A的存储位置各自对应的数据量相加,得到的和值作为所保留的用于存储数据A的存储位置对应的数据量,如图5所示。
对散列表进行查重可以按照如下2.1和/或2.2所述的方式(实施例一不限于2.1和/或2.2所述的方式):
2.1、如上所述,一方面,在对所述数据集合中的所有数据进行散列过程中,有些相同的数据已经被存储位置对应的数据量所表征,故对所述数据集合中的所有数据进行散列后,可能散列表中部分存储位置仍然为空;另一方面,对于任一数据,即使该数据需要存储至其第一存储位置以外的空存储位置或第二存储位置,该数据的实际存储位置也是从该数据的第一存储位置的下一个存储位置开始按序查找的,故该数据的第一存储位置与该数据的实际存储位置可能相邻;即使不相邻,数据的第一存储位置与该数据的实际存储位置之间的存储位置也非空。基于上述两方面可知,对所述数据集合中的所有数据进行散列后,散列表中可能存在一个或多个非空存储位置组,任一非空存储位置组包含连续的一个或多个非空存储位置,且该非空存储位置组的前一个和后一个存储位置为空存储位置。当然,该非空存储位置组的第一个存储位置可能就是散列表的第一个存储位置,或该非空存储位置组的最后一个存储位置可能就是散列表的最后一个存储位置。
故实施例一中,对散列表进行查重可以包括:确定散列表中的所有非空存储位置组,仅对各个非空存储位置组进行查重即可。其中,对各个非空存储位置组进行查重可以包括:对任一非空存储位置组,按照该非空存储位置组内的存储位置序号,依次对该非空存储位置组内的存储位置上存储的数据进行查重,以使对任一数据,若该非空存储位置组内有多个不同存储位置存储该数据,则保留一个存储位置用于存储该数据,并根据(该非空存储位置组内)存储该数据的所述多个不同存储位置对应的数据量,更新(该非空存储位置组内)所保留的用于存储该数据的存储位置对应的数据量。
2.2、对散列表进行查重可以包括:为散列表中的每个存储位置生成对应的查重线程(即用于查重的线程);对任一查重线程,若该查重线程对应的存储位置为空,则释放该查重线程;若该查重线程对应的存储位置的前一个存储位置非空,则释放该查重线程。可见,最终保留的查重线程实际上就是非空存储位置组中首个非空存储位置对应的线程。
2.2中,对于任一保留的查重线程,执行该查重线程,以便对该查重线程对应的非空存储位置组进行查重,以使若该查重线程对应的非空存储位置组内有多个不同存储位置存储该数据,则保留一个存储位置用于存储该数据,并根据(该非空存储位置组内)存储该数据的所述多个不同存储位置对应的数据量,更新(该非空存储位置组内)所保留的用于存储该数据的存储位置对应的数据量。其中,该查重线程对应的非空存储位置组为该查重线程对应的非空存储位置所在的非空存储位置组,非空存储位置组意义同上。具体的,该查重线程可以按照存储位置序号,依次对该查重线程对应的非空存储位置组内的各存储位置进行查重。
通过上述散列过程和查重过程,也就建立了所需散列表,实现了对数据集合内数据的散列。
实施例一中,对数据集合的数据进行散列过程中,对任一数据,即使该数据正在由其对应散列线程存储至散列表中的实际存储位置(可能是其第一存储位置或其他位置),其他任一散列线程也可以读取已存储至该数据的实际存储位置上的数据,并将已存储至该数据的实际存储位置上的数据与所述其他任一散列线程对应数据比较,根据比较情况选择更新该数据的实际存储位置对应的数据量还是将所述其他任一散列线程对应数据存入散列表的其他存储位置。这样一来,任一存储位置上的已存储数据可以被任一散列线程读取,任一散列线程向该存储位置写入数据不影响其他任一散列线程读取该存储位置上的已存储数据,也不影响其他任一散列线程如上根据比较情况选择更新数据量还是将所述其他任一散列线程对应数据存入散列表的其他存储位置,即任一散列线程向该存储位置写入数据并不会锁定该存储位置,也即无锁散列,实现了多个散列线程对各自对应的数据的并行散列,提高散列效率和散列表建立效率,减少散列表建立时间,提高机器性能和线程资源利用率。
实施例一中,查重过程一方面保证了查重后的散列表中不同的非空存储位置存储的数据不同;另一方面对于查重后的散列表内的任一非空存储位置,该非空存储位置对应的数据量,就表征了数据集合中与该非空存储位置所存储数据相同的数据的数量。若是将数据集合中相同的数据归为一类或一层,则查重后的散列表中的任一非空存储位置所存储数据即为一类或一层数据,任一非空存储位置对应一类或一层数据,任一非空存储位置对应的数据量,即为该非空存储位置对应的一类或一层数据包含的数据量。故实施例一同时实现了散列表建立和数据分类或数据分层。通过实施例一进行数据分类或分层后,可以基于数据的分类或分层进行后续操作,例如对分类或分层后的数据进行下采样,例如基于分类或分层后的上述点云数据进行网格编码。
实施例一中,对数据集合的数据进行散列后,大部分相同的数据已经可以通过其第一存储位置对应的数据量表征,即已经初步实现了数据分类或分层。散列过程后即使存在不同存储位置存储相同数据的情况,这样的存储位置也是少量的,从而在查重过程中,并不需要对每一存储位置执行一个查重线程,而是对一个非空存储位置组保留一个查重线程,释放其他查重线程,能够仅依靠少量的查重线程实现整个散列表的查重,能够节约线程资源,提高机器性能和提高查重效率,减少散列表建立时间,提高散列表建立效率。
实施例一中,由于相同的数据可以通过其存储位置对应链表中,与数据相同的节点对应的数据量表征,故散列表的存储位置数量可以大大小于数据集合中的数据量,这也有利于提高散列表建立效率,特别适用于数据大量重复的数据集合的散列(数据越重复,数据对应的存储位置越少)。需要说明的是,虽然实施例一中散列表的存储位置数量较少,但可以通过合适的散列函数,使得每一数据对应的索引值小于散列表的存储位置数量。例如散列表的存储位置数量为x,则通过散列函数得到数据A对应的唯一的整数(即为key)后,可以将该整数与x进行求余,即执行key%hash_size,其中hash_size为x,取余数作为数据A对应的索引值。
由于实施例一的上述特点,实施例一的散列过程和查重过程特别适用于在GPU内进行,即实现了在GPU内的多个散列线程对各自对应的数据的并行散列,相比于在CPU进行散列,散列表建立耗时大大缩短,散列表建立效率大大提高。以上述点云数据为例,实验表明,对于包含122336584点的点云数据集,采用实施例一所述方法在GPU内进行散列,散列表建立耗时仅150ms,而现有的CPU散列表建立耗时1400ms,现有的GPU散列表建立耗时超过5000ms,实施例一所述方法散列表建立耗时明显缩短,散列表建立效率明显提高。
如图6所示,本说明书第二个实施例提供一种与实施例一所述方法对应的无锁散列装置,包括:
建表模块202,用于获取数据集合,构建用于存储所述数据集合中的数据的散列表,所述散列表中包含预设数量个存储位置;
散列模块204,用于对任一数据,对该数据进行散列,包括:对任一数据,确定该数据对应的索引值,根据所述索引值确定该数据对应的第一存储位置,判断所述第一存储位置是否正在存储数据;若所述第一存储位置正在存储数据,且所述第一存储位置已存储的数据与该数据相同,则更新所述第一存储位置对应的数据量;若所述第一存储位置已存储的数据与该数据不同,则将该数据存储至未存储数据的存储位置或将该数据存储至已存储与该数据相同的数据的第二存储位置;若所述第一存储位置未存储数据,则将该数据存储至所述第一存储位置;
查重模块206,用于对所述数据集合中的所有数据进行散列后,对所述散列表进行查重,以使:对任一数据,若有多个不同存储位置存储该数据,则保留一个存储位置用于存储该数据,并根据存储该数据的所述多个不同存储位置对应的数据量,更新所保留的用于存储该数据的存储位置对应的数据量。
可选的,所述散列模块204,还用于对任一数据,生成该数据对应的散列线程,执行所述散列线程,以对该数据进行散列。
可选的,对所述散列表进行查重包括:
确定所述散列表中的一个或多个非空存储位置组,任一非空存储位置组包含连续的一个或多个非空存储位置;其中,非空存储位置为存储有数据的存储位置,空存储位置为未存储数据的存储位置;
对各个非空存储位置组进行查重。
可选的,对各个非空存储位置组进行查重包括:
对任一非空存储位置组,按照该非空存储位置组内的存储位置序号,依次对该非空存储位置组内的存储位置上存储的数据进行查重,以使对任一数据,若该非空存储位置组内有多个不同存储位置存储该数据,则保留一个存储位置用于存储该数据,并根据存储该数据的所述多个不同存储位置对应的数据量,更新所保留的用于存储该数据的存储位置对应的数据量。
可选的,对所述散列表进行查重包括:
为散列表中的每个存储位置生成对应的查重线程;
对任一查重线程,若该查重线程对应的存储位置为空,则释放该查重线程;若该查重线程对应的存储位置的前一个存储位置非空,则释放该查重线程;
对于任一保留的查重线程,执行该查重线程,以便对该查重线程对应的非空存储位置组进行查重,以使若该查重线程对应的非空存储位置组内有多个不同存储位置存储该数据,则保留一个存储位置用于存储该数据,并根据存储该数据的所述多个不同存储位置对应的数据量,更新所保留的用于存储该数据的存储位置对应的数据量;
其中,该查重线程对应的非空存储位置组为该查重线程对应的非空存储位置所在的非空存储位置组,任一非空存储位置组包含连续的一个或多个非空存储位置;非空存储位置为存储有数据的存储位置,空存储位置为未存储数据的存储位置。
可选的,将该数据存储至未存储数据的存储位置或将该数据存储至已存储与该数据相同的数据的第二存储位置包括:
从所述第一存储位置之后的首个存储位置开始,按照存储位置序号循环查找散列表中的存储位置;
若首先查找到第二存储位置,所述第二存储位置已存储的数据与该数据相同,则更新所述第二存储位置对应的数据量;
若首先查找到未存储数据的存储位置,则将该数据存储至所述未存储数据的存储位置。
可选的,确定该数据对应的索引值包括:
根据散列函数确定该数据对应的索引值。
可选的,根据存储该数据的所述多个不同存储位置对应的数据量,更新所保留的用于存储该数据的存储位置对应的数据量包括:
将存储该数据的所述多个不同存储位置对应的数据量之和,作为所保留的用于存储该数据的存储位置对应的数据量。
可选的,对该数据进行散列,还包括:判断所述第一存储位置是否已存储数据;若所述第一存储位置已存储数据,且所述第一存储位置已存储的数据与该数据相同,则更新所述第一存储位置对应的数据量。
本说明书第三个实施例提供一种无锁散列设备,包括:
至少一个处理器;
以及,
与所述至少一个处理器通信连接的存储器;
其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,使所述至少一个处理器能够执行实施例一所述方法。
本说明书第四个实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令被处理器执行时实现实施例一所述方法。
上述各实施例可以结合使用,不同实施例之间或同一实施例内的名称相同的模块可以是相同或不同的模块。
上述对本说明书特定实施例进行了描述,其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,附图中描绘的过程不一定必须按照示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机可读存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书实施例提供的装置、设备、非易失性计算机可读存储介质与方法是对应的,因此,装置、设备、非易失性计算机存储介质也具有与对应方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说明,因此,这里不再赘述对应装置、设备、非易失性计算机存储介质的有益技术效果。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device, PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20 以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本说明书实施例可提供为方法、系统、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带式磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本说明书实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。