CN117707783A - 一种针对无锁链表的数据处理方法、装置、设备及介质 - Google Patents
一种针对无锁链表的数据处理方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN117707783A CN117707783A CN202311855288.6A CN202311855288A CN117707783A CN 117707783 A CN117707783 A CN 117707783A CN 202311855288 A CN202311855288 A CN 202311855288A CN 117707783 A CN117707783 A CN 117707783A
- Authority
- CN
- China
- Prior art keywords
- node
- task
- thread
- linked list
- lock
- 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
- 238000003672 processing method Methods 0.000 title abstract description 14
- 238000000034 method Methods 0.000 claims abstract description 74
- 230000008569 process Effects 0.000 claims abstract description 30
- 238000012545 processing Methods 0.000 claims description 45
- 238000004590 computer program Methods 0.000 claims description 15
- 239000003550 marker Substances 0.000 claims description 7
- 238000012217 deletion Methods 0.000 abstract description 7
- 230000037430 deletion Effects 0.000 abstract description 7
- 238000010586 diagram Methods 0.000 description 20
- 230000006870 function Effects 0.000 description 15
- 238000004422 calculation algorithm Methods 0.000 description 8
- 230000004048 modification Effects 0.000 description 8
- 238000012986 modification Methods 0.000 description 8
- 230000007246 mechanism Effects 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 238000003780 insertion Methods 0.000 description 3
- 230000037431 insertion Effects 0.000 description 3
- 238000011144 upstream manufacturing Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 125000004122 cyclic group Chemical group 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000006386 memory function Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000004064 recycling Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种针对无锁链表的数据处理方法、装置、设备及介质,应用于信息技术领域,用于解决现有技术中并发线程存在线程冲突的问题。方法包括:第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点;待删除状态为执行第二任务的第二线程对第二任务目标节点进行标注的;第一任务用于对无锁链表进行第二节点的操作;第二任务用于对无锁链表中的第二任务目标节点进行删除操作;若存在待删除状态的第一节点,则从无锁链表中删除第一节点后,继续执行第一任务。该方法通过仅先将待删除节点进行标记,在后续其他线程启动后,才对含有删除标记的待删除节点进行删除,来解决现有技术中并发线程存在线程冲突的问题。
Description
技术领域
本发明涉及信息技术领域,尤其涉及一种针对无锁链表的数据处理方法、装置、设备及介质。
背景技术
目前,使用无锁哈希链表来保证数据的安全性。其中,无锁哈希链表是一种并发数据结构,用于在多线程环境下实现高效的插入、查找和删除操作,使得DNS缓存无需使用显式的锁机制。然而,在并发线程同时处理节点添加与节点删除的操作中,无锁哈希链表存在线程冲突问题,导致线程安全受到挑战。
发明内容
本发明提供一种针对无锁链表的数据处理方法、装置、计算设备及存储介质,通过调整无锁链表中节点的删除操作流程,解决现有技术中并发线程存在线程冲突的问题。
第一方面,本发明提供一种针对无锁链表的数据处理方法,方法包括:第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点;待删除状态为执行第二任务的第二线程对第二任务目标节点进行标注的;第一任务用于对无锁链表进行第二节点的操作;第二任务用于对无锁链表中的第二任务目标节点进行删除操作;若存在待删除状态的第一节点,则从无锁链表中删除第一节点后,继续执行第一任务。
本方案从无锁链表的节点删除操作流程入手,由原先的直接修改上下游节点的指针来删除节点,调整为在对节点进行删除之前,仅先将待删除节点进行标记,在后续其他线程启动后,才对含有删除标记的待删除节点进行安全回收。通过这种方式,解决传统技术中并发线程存在线程冲突的问题。
可选地,确定无锁链表中是否存在标记为待删除状态的第一节点之前,还包括:第二线程标注第二任务目标节点为待删除状态后,将第二任务目标节点的标识增加至标记记录中;确定无锁链表中是否存在标记为待删除状态的第一节点,包括:第一线程确定无锁链表中标记记录指示的节点是否标记有待删除状态。
可选地,第二线程标注第二任务目标节点为待删除状态,包括:第二线程设置第二任务目标节点中下一指针的指示位为设定值,设定值表征为待删除状态。
可选地,任一线程包括临时指针,任一线程的临时指针继承在先线程的临时指针;将第二任务目标节点的标识增加至标记记录中,包括:将第二任务目标节点的标识添加至第二线程的临时指针的指向对象中。
可选地,第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点,包括:第一线程在执行第一任务的过程中,遍历无锁链表中的各节点,通过每个节点中下一指针中的指示位,确定是否存在标记为待删除状态的第一节点。
可选地,确定无锁链表中是否存在标记为待删除状态的第一节点,包括:第一线程通过创建的第一虚拟查找器模块,确定无锁链表中是否存在标记为待删除状态的第一节点;第二线程对第二任务目标节点进行标注,包括:第二线程通过创建的第二虚拟查找器模块,对第二任务目标节点进行标注;从无锁链表中删除第一节点,包括:第一线程通过第一虚拟查找器模块从无锁链表中删除第一节点。
可选地,任一虚拟查找器模块包括虚拟节点;任一虚拟节点包括当前指针以及尾部指针;第一任务用于在无锁链表的第一任务目标节点之前增加第二节点;在遍历第一任务目标节点之后,第一虚拟节点的当前指针指向第一任务目标节点的前一节点,第一虚拟节点的尾部指针指向第一任务目标节点;继续执行第一任务,包括:通过第一虚拟节点的尾部指针设置第二节点中下一指针为第一任务目标节点;通过第一虚拟节点的当前指针设置第一任务目标节点的前一节点的下一指针为第二节点。
可选地,通过第一虚拟查找器模块从无锁链表中删除第一节点,包括:判断第一节点是否处于静默状态;若处于静默状态,则通过第一虚拟查找器模块从无锁链表中删除第一节点。
可选地,判断第一节点是否处于静默状态,包括:计算各线程与第一节点的关联系数;根据第一节点的关联系数,确定第一节点是否处于静默状态。
第二方面,本发明提供了一种针对无锁链表的数据处理装置,该针对无锁链表的数据处理装置包括:处理单元,用于第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点;所述待删除状态为执行第二任务的第二线程对第二任务目标节点进行标注的;所述第一任务用于对所述无锁链表进行第二节点的操作;所述第二任务用于对所述无锁链表中的所述第二任务目标节点进行删除操作;若存在待删除状态的第一节点,则从所述无锁链表中删除所述第一节点后,继续执行所述第一任务。
可选地,所述处理单元,具体用于所述第二线程标注所述第二任务目标节点为待删除状态后,将所述第二任务目标节点的标识增加至标记记录中;所述第一线程确定所述无锁链表中所述标记记录指示的节点是否标记有待删除状态。
可选地,所述处理单元,具体用于所述第二线程设置所述第二任务目标节点中下一指针的指示位为设定值,所述设定值表征为待删除状态。
可选地,所述任一线程包括临时指针,任一线程的临时指针继承在先线程的临时指针;所述处理单元,具体用于将所述第二任务目标节点的标识添加至所述第二线程的临时指针的指向对象中。
可选地,所述处理单元,具体用于第一线程在执行第一任务的过程中,遍历无锁链表中的各节点,通过每个节点中下一指针中的指示位,确定是否存在标记为待删除状态的第一节点。
可选地,所述处理单元,具体用于第一线程通过创建的第一虚拟查找器模块,确定无锁链表中是否存在标记为待删除状态的第一节点;第二线程通过创建的第二虚拟查找器模块,对第二任务目标节点进行标注;第一线程通过所述第一虚拟查找器模块从所述无锁链表中删除所述第一节点。
可选地,任一所述虚拟查找器模块包括虚拟节点;任一所述虚拟节点包括当前指针以及尾部指针;所述第一任务用于在所述无锁链表的第一任务目标节点之前增加第二节点;在遍历所述第一任务目标节点之后,第一虚拟节点的当前指针指向第一任务目标节点的前一节点,所述第一虚拟节点的尾部指针指向第一任务目标节点;所述处理单元,具体用于通过所述第一虚拟节点的尾部指针设置所述第二节点中下一指针为所述第一任务目标节点;通过所述第一虚拟节点的当前指针设置所述第一任务目标节点的前一节点的下一指针为所述第二节点。
可选地,所述处理单元,具体用于判断所述第一节点是否处于静默状态;若处于静默状态,则通过所述第一虚拟查找器模块从所述无锁链表中删除所述第一节点。
可选地,所述处理单元,具体用于计算各线程与所述第一节点的关联系数;根据所述第一节点的关联系数,确定所述第一节点是否处于静默状态。
第三方面,本发明提供了一种计算设备,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行上述第一方面任一所述的针对无锁链表的数据处理方法。
第四方面,本发明还提供了一种计算机可读存储介质,所述存储介质存储有程序,当所述程序在计算机上运行时,使得计算机实现执行上述第一方面任意所述的针对无锁链表的数据处理方法。
上述第二方面至第四方面的有益效果,具体请参照上述第一方面中相应设计可以达到的技术效果,这里不再重复赘述。
附图说明
为了更清楚地说明本发明中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术提供的一种针对无锁链表的数据处理示意图;
图2为本发明实施例提供的一种应用场景示意图;
图3为本发明实施例提供的一种虚拟节点的结构示意图;
图4为本发明实施例提供的一种针对无锁链表的数据处理方法的流程示意图;
图5为本发明实施例提供的一种删除第一节点的方法流程示意图;
图6为本发明实施例提供的一种判断第一节点是否处于静默状态的方法流程示意图;
图7为本发明实施例提供的一种添加节点的数据处理示意图;
图8为本发明实施例提供的一种针对无锁链表的数据处理示意图;
图9为本发明实施例提供的一种针对无锁链表的数据处理示意图;
图10为本发明实施例提供的一种针对无锁链表的数据处理装置结构图;
图11为本发明实施例提供的一种计算设备的结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
需要说明的是,在本发明的描述中“多个”理解为“至少两个”。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。A与B连接,可以表示:A与B直接连接和A与B通过C连接这两种情况。另外,在本发明的描述中,“第一”、“第二”等词汇,仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。
以下,对本发明中的部分用语进行解释说明。需要说明的是,这些解释是为了便于本领域技术人员理解,并不是对本发明所要求的保护范围构成限定。
1)比较并交换(Compare And Swap,CAS)
CAS是一种原子操作,常用于并发编程中实现无锁数据结构和同步机制。CAS操作包含三个输入参数:一个用于比较的内存地址、期望的旧值和要更新的新值。CAS操作会比较内存地址处的值与旧值是否相等,如果相等,则将内存地址处的值替换为新值,否则不进行任何操作。
2)无锁链表
无锁链表是一种基于CAS操作的并发数据结构。无锁链表不使用锁,而是通过CAS操作来实现对链表节点的并发访问和修改。具体来说,无锁链表中的每个节点都包含一个数据域和一个指向下一个节点的指针。在进行插入或删除操作时,需要先遍历链表找到待操作节点的前驱节点,然后使用CAS操作来更新前驱节点的指针,将其指向新节点或下一个节点。
3)生存时间(Time To Live,TTL)
对于DNS服务器,TTL表示DNS记录在DNS服务器上的存留时间。一般来说,TTL的数值越小,表明存留的时间越短。
4)哈希图(HashMap)
HashMap是一种常见的数据结构,用于存储键值对(Key-Value Pairs)。HashMap基于哈希表(Hash Table)实现,使用一个哈希函数将键映射到存储哈希桶(Bucket)中。其中,每个存储桶是一个链表或红黑树的数据结构。
5)线程安全
线程安全是指在多线程环境下,程序或数据结构能够正确地处理并发访问,而不会出现不确定的结果或导致程序崩溃。在多线程编程中,如果多个线程同时访问共享资源,可能会导致竞态条件(race condition)和其他并发问题。
前文介绍了本发明实施例所涉及到的一些用语,下面对现有技术中的无锁链表进行数据处理时的方法进行说明。
传统的DNS缓存是将每个资源记录集(RRSET)中的资源记录(Resource Record,RR)分别进行存储,查找时再将每一条资源记录组合成RRSET进行应答。当客户端发起DNS域名请求,DNS递归服务器会读取其缓存,如果缓存中有请求的域名的缓存数据,则DNS递归服务器会立即应答给客户端。如果缓存中不存在请求的域名,则DNS递归服务器会向外递归或迭代,以得到请求域名的结果,之后,DNS递归服务器会在向客户端应答的同时将请求域名的结果进行缓存,即写入DNS缓存。通常,DNS递归服务器接收的域名请求中有95%以上的域名会直接命中缓存,所以可以看出,DNS缓存是一种读多写少的数据集。为了提高DNS递归服务器的性能并保证数据的一致性,递归服务器多采用多线程的架构,在每个线程中都会发生读写操作,为保证数据的安全性,就需要对缓存加锁。
相关技术中,无论是互斥锁还是读写锁,当写操作发生时,所有其他读操作和写操作要等待写操作完成。即使对于DNS递归服务器来说,虽然对于其缓存,读操作较多写操作较少,但随着对性能需求的增长,使用锁操作的DNS缓存成为DNS递归服务器性能的瓶颈点。
为解决上述DNS性能瓶颈问题,现有技术通过无锁链表以及HashMap来替代DNS缓存的读写锁,从而提高DNS缓存更新的性能。其处理流程包括以下过程:
过程a1,创建至少一个哈希桶。
其中,每个哈希桶都是一个单向链表。
过程a 2,将原始的DNS请求报文(Raw Data)进行获取,并将其解析成为结构体(Message)。
过程a 3,从DNS解析结果获取请求域名(qname)以及请求类型(qtype),将二者元素拼接为字符串,并进行散列运算,得到哈希值H,之后将H映射至其中一个哈希桶。
过程a 4,将原始的DNS请求报文(raw data)以及结构体(message),存储至选中的哈希桶内。
在过程a4中,在针对无锁链表的修改类操作时,关注的仅是操作上的原子性(对于无锁链表,通常使用CAS操作确保原子性),对各种写操作与读操作按串行的方式来进行调度。
然而,在多线程并发场景下,对无锁链表中的节点进行添加与删除的操作上,存在线程安全问题,具体原因描述如下:
如图1所示,为现有技术提供的一种针对无锁链表的数据处理示意图。图1中,链表内有三个当前节点,分别记为N1、N2、N3。链表内每一个节点都含有一个指向链表下一节点的指针,记为下一指针,也即next指针。假设目前DNS缓存服务器所在的操作系统上,有两个线程正在并发运行,分别记为Thread1、Thread2。其中,Thread1负责从当前链表移除节点,而Thread2负责对当前链表添加节点Nk。图1所示的线程安全问题描述如下:
在t1时刻,Thread1、Thread2并发运行,取得了这样的一个关系:N1→next=N2,即N1节点的下一节点位置为N2。
在t2时刻,Thread2准备将节点Nk插入至链表中节点N2的位置,为此,在Nk节点的内存数据结构创建后,Thread2调用CAS,修改了节点Nk的next指针,指向了节点N3。需要注意的是,在t2时刻还未完成对节点N1的next指针的修改。
在t3时刻,Thread1准备从链表移除节点N2,为此,Thread1将调用CAS操作,修改节点N1的next指针,让其指向节点N3。然而,因为线程并发调度,在t3时刻,Thread2继续完成对节点Nk的剩余添加流程,即将N1的next指针指向Nk。显然,此时问题出现:在t3时刻,两个线程同时发生了对N1指针的修改操作的争抢,此时Thread1、Thread2将发生堵塞,对应的计算机程序发生异常。
因此可以说,现有技术在并发线程同时处理节点添加与节点删除的操作中,无锁哈希链表存在线程冲突问题,导致线程安全受到挑战。
为了解决上述问题,本发明实施例提供一种针对无锁链表的数据处理方法、装置、计算设备及存储介质,通过调整无锁链表中节点的删除操作流程,解决现有技术中并发线程存在线程冲突的问题。
如图2所示,为本发明实施例提供的一种应用场景示意图。该应用场景包括无锁链表201和至少一个线程202(图2中示出两个线程202)。下面分别对无锁链表201和至少一个线程202进行介绍。
无锁链表201中包括至少一个节点,每个节点都包含一个数据域和一个指向下一个节点的指针(称其为下一指针,也写作next指针)。无锁链表201中节点的排序是按照数据域中数据的大小进行排序的。当触发对无锁链表201的操作任务时,操作系统会创建至少一个线程202去执行该操作任务。通常,操作任务包括但不限于对无锁链表201的读操作以及写操作。常见的写操作包括在无锁链表201中添加节点以及删除节点。本发明实施例中,无锁链表201支持多个线程202在没有锁的情况下并发地访问和修改数据。
可选地,为实现节点的安全回收,本发明实施例设置无锁链表201中任一节点的next指针的指示位,作为删除标记位。其中,next指针的指示位可以是指next指针的最后一位。其中,当next指针的指示位为0时,表示该节点为非删除节点。当next指针的指示位为1时,表示该节点为待删除节点;
至少一个线程202负责执行该线程对应的操作任务。
本发明实施例中,任一线程202包括虚拟查找器模块,也称为虚拟(dummy)节点查找器。虚拟查找器模块为整个无锁链表节点的检索、添加、删除操作的核心功能模块。借助该虚拟查找器模块,可解决在多线程并发场景下存在的线程安全问题。
可选地,虚拟查找器模块包括虚拟节点。图3示出本发明实施例提供的一种虚拟节点的结构示意图。其中,虚拟节点包括当前(curr)指针以及尾部(tail)指针。curr指针指向当前链表节点的查找位置。tail指针指向curr指针指向的节点的下一紧邻节点。
可选地,虚拟查找器模块还包括临时指针(也称为pointer指针)。任一线程的临时指针继承在先线程的临时指针。具体地,若操作系统是第一次启动线程,则初始化该线程的临时指针指向的节点为虚拟节点的curr指针指向节点的下一个紧邻节点。若操作系统已经启动过线程,则一个新的线程启动时,该新的线程的临时指针继承在先线程的临时指针的值。
本发明实施例中,根据操作任务创建线程后,线程会先调用虚拟查找器模块,通过虚拟查找器模块运行并创建虚拟节点以及临时指针。之后,线程会结合其本身的操作任务的类型,根据虚拟节点对链表节点执行增加、删除等不同操作。
具体地,当操作任务的类型为增加节点时:
线程会将待增加节点所包含的数据片段内容(如前述所提及的DNS域名缓存数据)送入虚拟查找器模块,虚拟查找器模块生成符合线程安全要求的虚拟节点。此后通过虚拟节点从链表的头部位置开始顺着链表进行遍历查找任务目标节点。同时,虚拟查找器模块中的临时指针将会对遍历过的所有链表节点的标记位进行判断,若是含有删除标记的,线程通过虚拟查找器模块对该待删除节点进行安全释放。之后,虚拟查找器模块找寻到任务目标节点,并通过调用CAS操作将待增加节点增加到链表中任务目标节点之前。
当线程任务的类型为删除节点时:
线程会将待删除节点所包含的数据片段内容(如前述所提及的DNS域名缓存数据)送入虚拟查找器模块,虚拟查找器模块生成符合线程安全要求的虚拟节点。此后通过虚拟节点从链表的头部位置开始顺着链表进行遍历查找任务目标节点。同时,虚拟查找器模块中的临时指针将会对遍历过的所有链表节点的标记位进行判断,若是含有删除标记的,线程通过虚拟查找器模块对该待删除节点进行安全释放。之后,虚拟查找器模块找寻到任务目标节点,并通过调用CAS操作在待删除节点中下一指针的指示位为待删除状态。
基于上述图2中的应用场景,如图4所示,为本发明实施例提供的一种针对无锁链表的数据处理方法的流程示意图,该方法包括以下步骤:
步骤401,第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点。
其中,第一任务用于对无锁链表进行第二节点的操作。第一任务包括但不限于添加节点、删除节点等等。在操作系统中触发第一任务后,会创建第一线程去至执行第一任务。第一线程启动后,会先确定无锁链表中是否存在标记为待删除状态的第一节点。
其中,待删除状态为执行第二任务的第二线程对第二任务目标节点进行标注的。第二任务用于对无锁链表中的第二任务目标节点进行删除操作。需要说明的是,本发明实施例并不限定第一任务的类型和第二任务的类型,在一种可能的实现方式中,第一任务的类型和第二任务的类型相同。
可选地,在确定无锁链表中是否存在标记为待删除状态的第一节点之前,方法还包括:第二线程标注所述第二任务目标节点为待删除状态后,将第二任务目标节点的标识增加至标记记录中。具体地,本发明实施例中,第二线程先执行第二任务,将无锁链表中的第二任务目标节点标记为待删除状态,将该标记为待删除状态的节点称为第一节点,之后,将第二任务目标节点(也即第一节点)的标识增加至标记记录中。之后,用于执行第一任务的第一线程被创建。需要说明的是,假设第二线程对应的第二任务是用于对无锁链表中第二任务目标节点进行添加操作,而非删除操作,在第二线程完成第二任务后,也会将第二任务目标节点的标识增加至标记记录中。
进一步可选地,任一线程包括临时指针,任一线程的临时指针继承在先线程的临时指针。将第二任务目标节点的标识增加至标记记录中,包括:将第二任务目标节点的标识添加至第二线程的临时指针的指向对象中。
进一步可选地,第二线程标注第二任务目标节点为待删除状态,包括:第二线程设置第二任务目标节点中下一指针的指示位为设定值,设定值表征为待删除状态。具体地,关于下一指针的指示位可参见前述相关介绍,此处不再赘述。假使下一指针中的指示位为1代表该节点为待删除节点,下一指针中的指示位为0代表该节点为非删除节点。则第二线程通过设置第二任务目标节点中下一指针的指示位为1,来标记第二任务目标节点为待删除节点。
可选地,第一线程确定无锁链表中是否存在标记为待删除状态的第一节点的方法可以为:第一线程在执行第一任务的过程中,遍历无锁链表中的各节点,通过每个节点中下一指针中的指示位,确定是否存在标记为待删除状态的第一节点。具体地,假使下一指针中的指示位为1代表该节点为待删除节点,下一指针中的指示位为0代表该节点为非删除节点。则第一线程在执行第一任务的过程中,遍历无锁链表中的各节点,通过识别每个节点中下一指针中的指示位是否为1,来确定所遍历的节点是否为待删除节点。
步骤402,若存在待删除状态的第一节点,则第一线程从无锁链表中删除第一节点后,继续执行第一任务。
具体地,若第一线程确定无锁链表中存在待删除状态的第一节点,则第一线程会先从无锁链表中删除第一节点,之后,再执行第一任务。
本发明实施例中,通过上述步骤401至步骤402,从无锁链表的节点删除操作流程入手,由原先的直接修改上下游节点的指针来删除节点,调整为在对节点进行删除之前,仅先将待删除节点进行标记,在后续其他线程启动后,才对含有删除标记的待删除节点进行安全回收。通过这种方式,解决传统技术中并发线程存在线程冲突的问题。
可选地,在上述步骤401中,第一线程可以通过第一虚拟查找器模块中的虚拟节点来遍历无锁链表。设置查找的起点位置为目标链表的头部节点,即head_node,将虚拟节点的{curr,tail}两个指针进行初始化:curr=head_node,tail=head_node→next。也即是说,将虚拟节点的当前指针指向头部节点,将虚拟节点的尾部指针指向头部节点的下一紧邻节点。设置临时指针为:pointer=curr→next,即临时指针指向的是虚拟节点的当前指针所指向节点的下一个紧邻节点。判断第一虚拟节点的尾部指针是否指向第一任务目标节点,若没有,则修改{curr,tail}两个指针:curr=tail,tail=pointer→next,使得虚拟节点沿着无锁链表继续遍历找寻第一任务目标节点。
进一步地可选地,在遍历中,可以采用一个统一的排序对比方法,例如使用二分查找、分块查找等排序查找方法,来找寻第一任务目标节点,加快遍历效率。
在一种可能的实现方式中,第一线程确定无锁链表中是否存在标记为待删除状态的第一节点的方法可以为:第一线程创建后,确定无锁链表中标记记录指示的节点是否标记有待删除状态。具体地,标记记录中存储有操作系统中各线程执行任务后对应的任务目标节点。若第一线程是操作系统中第一个启动的线程,也就是说,第一线程之前并没有其他线程启动过,则标记记录中没有对应指示的节点。若在第一线程创建前,在操作系统中已经启动过线程,称其为第二线程,则标记记录中存储有第二线程执行任务后对应的第二任务目标节点。
在第一线程创建后,会逐个判断无锁链表中标记记录中指示的节点是否标记有待删除状态,若存在标记为待删除状态的第一节点,则第一线程会删除该第一节点。
在一种可能的实现方式中,任一线程均包括虚拟查找器模块。关于虚拟查找器模块的详细内容可参见前述,此处不再赘述。则:
1、确定无锁链表中是否存在标记为待删除状态的第一节点,包括:第一线程通过创建的第一虚拟查找器模块,确定无锁链表中是否存在标记为待删除状态的第一节点。
具体地,第一线程通过第一虚拟查找器模块中的临时指针来确定无锁链表中是否存在标记为待删除状态的第一节点。
2、第二线程对第二任务目标节点进行标注,包括:第二线程通过创建的第二虚拟查找器模块,对第二任务目标节点进行标注。
具体地,第二线程通过第二虚拟查找器模块中的虚拟节点来对第二任务目标节点进行标注。其中,虚拟节点可以使用MARK函数来将第二任务目标节点进行标注。示例性地,假设下一指针中的指示位为1代表该节点为待删除节点,下一指针中的指示位为0代表该节点为非删除节点,则虚拟节点通过函数MARK(NodePointerk,0)来将第二任务目标节点(无锁链表中的第k个节点)的下一指针的最后一个位置标注为0。其中,k为正整数。同理,虚拟节点通过函数MARK(NodePointerk,1)来将第二任务目标节点(无锁链表中的第k个节点)的下一指针的最后一个位置标注为1。
需要说明的是,在对第二任务目标节点进行标注后,第二线程通过CAS(curr→next,tail,MARK(pointer→next,0)),即通过CAS操作将curr的next指针修改为临时指针指向的节点的下一紧邻节点位置。
3、从无锁链表中删除第一节点,包括:第一线程通过第一虚拟查找器模块从无锁链表中删除第一节点。
具体地,图5示出本发明实施例提供的一种删除第一节点的方法流程示意图。该方法包括以下步骤:
步骤501,判断第一节点是否处于静默状态。
具体地,若第一节点处于静默状态,则执行步骤502,若第一节点不处于静默状态,则执行步骤503。其中,预设周期可以根据有技术人员根据经验进行设定,本发明实施例对此不做具体限定。
结合图6,为本发明实施例提供的一种判断第一节点是否处于静默状态的方法流程示意图。该方法包括以下步骤:
步骤601,计算各线程与第一节点的关联系数。
计算各线程与第一节点的关联系数的过程包括:
过程b1,操作系统启动时初始化操作系统的全局变量global_flag与各线程的局部变量local_flag,且设置各线程的local_flag等于global_flag。示例性地,假设某一时段,全局变量global_flag的值为1,则设置各线程的局部变量local_flag均为1。
过程b2,在各个线程运行过程中,通过ATOMIC_LOAD函数来更新各个线程的局部变量local_flag。其中,ATOMIC_LOAD是一种原子操作函数,其公式为:ATOMIC_LOAD(&(thread_id,global_flag,*node)),用于计算线程与目标节点指针的关联离散程度。thread_id指线程的标识ID,*node指目标节点的指针地址。通过ATOMIC_LOAD函数,可以计算得出各个线程的与目标节点的关联系数。
具体地,通过ATOMIC_LOAD函数计算各个线程的与目标节点的关联系数的具体循环流程为:
过程c,进入主循环等待流程,每次循环休眠等待一个固定的周期,例如100000微秒。
过程c1,记目标链表节点为dst_node,通过计算机程序函数GET_ADDR,获取待删除的目标链表节点的指针:GET_ADDR(dst_node)。
过程c2,设置临时变量target_flag,用以记录当前的global_flag的数值,即设置target_flag=global_flag。
过程c3,将global_flag的值自增加1,推高后的值作为下一次主循环等待流程下的静默状态的判断条件,判断的方式参见下方的子循环流程。
过程c4,进入子循环,该循环为无限循环,直到满足静默状态条件(即下方c.4.2与c.4.3)后退出循环。
过程c4.1,计算操作系统上各线程与待删除目标节点的关联离散程度,并更新各线程的局部变量,即:
(local_flag)_k=ATOMIC_LOAD(&(thread_id,global_id,GET_ADDR(dst_node)))。
过程c4.2,取出所有线程各个local_flag最小值,记为min_flag。
过程c4.3,比较min_flag与target_flag大小,若min_flag>target_flag,则表示待删除的链表节点进入了静默状态,可直接调用内存free函数,直接物理释放del_index指针指向的内存数据结构,即:free(dst_pointer);否则重新回到子循环流程,重新从c.4.1步骤往下执行。
步骤602,根据第一节点的关联系数,确定第一节点是否处于静默状态。
具体地,当关联系数越大于global_flag,则表示线程与目标节点越无关联,反之,当关联系数越小于global_flag,则表示目标节点与线程越有关联。
步骤502,若处于静默状态,则通过第一虚拟查找器模块从无锁链表中删除第一节点。
步骤503,若不处于静默状态,则等待预设周期,之后,重新判断第一节点是否处于静默状态。
传统的内存回收一般采用引用计算算法,引用计数算法是一种简单而直观的内存回收算法。它的基本思想是为每个内存对象(例如链表节点)维护一个引用计数器counter,counter记录当前有多少个指针引用了内存该对象。当引用计数器变为0时,表示该对象不再被引用,可以被回收。引用计数算法不需要遍历整个对象图(例如整个链表内存链条),具有低延迟和高实时性的特点。然而引用计数算法存在一些严重问题:一是循环引用,引用计数算法无法处理循环引用的情况,即两个或多个对象相互引用,导致它们的引用计数器一直不为0,无法实施内存回收,使得回收线程一直处于pending状态,也可能导致内存泄漏隐患,特别在多线程中并发场景中,较容易导致对象的互相引用。二是性能开销,引用计数算法需要频繁地更新引用计数器counter,这会带来额外的计算机程序性能开销。特别是在多线程环境下,为保证更新操作的原子性,计算机程序需引入额外的处理机制完成引用计数器counter的更新,此时将引发较高的开销和程序复杂性。
本文设计的内存安全回收器,用于解决并发环境下的内存管理问题,特别是针对无锁链表数据结构,有效解决在引用计数算法中循环引用问题以及高开销问题。该机制核心是在多线程中寻找一种静默状态。当节点进入静默状态时,可确保其不会被其他操作系统上的线程访问或者占用,可进行内存安全回收。
在一种可能的实现方式中,第一任务用于在无锁链表的第一任务目标节点之前增加第二节点;在遍历第一任务目标节点之后,第一虚拟节点的当前指针指向第一任务目标节点的前一节点,第一虚拟节点的尾部指针指向第一任务目标节点。
如图7所示,为本发明实施例提供的一种添加节点的数据处理示意图。步骤402中的继续执行第一任务,包括:
过程d1,通过第一虚拟节点的尾部指针设置第二节点中下一指针为第一任务目标节点。
具体地,将第二节点newnode的下一指针,置为第一虚拟节点的尾部指针,即:
GET_ADDR(newnode)→next=tail。
过程d2,通过第一虚拟节点的当前指针设置第一任务目标节点的前一节点的下一指针为第二节点。
具体地,通过CAS操作,将第一虚拟节点的当前指针设置第一任务目标节点的前一节点的下一指针为第二节点,CAS操作可以表达为:
CAS(curr→next,tail,GET_ADDR(newnode))。
通过修改目标节点插入位置之前一个节点的指针,即curr指针,将其next指针指向newnode。由于过程d1中已完成第二节点newnode的下一指针修改,因此,此时已完成新节点的添加操作。
为了使本发明实施例的方案更加清晰,下面介绍本发明实施例提供的一种针对无锁链表的数据处理方法的具体实现方式。图8以及图9示出了该示例中的数据处理示意图。参见图8以及图9,该数据处理过程为:
假设目前DNS缓存服务器所在的操作系统上,链表当前有三个节点,分别记为N1、N2、N3。Thread1与Thread2并发运行。其中,Thread1的任务是从当前链表移除节点N2,而Thread2的任务是添加的节点Nk。
(1)在t0时刻,操作系统创建了Thread1与Thread2,并指派Thread1为删除节点处理线程,Thread2为增加节点处理线程。线程创建时操作系统为两个线程输入了目标节点数据片段内容data。这里data可理解为DNS域名缓存数据。假设在采用的统一的排序对比方法之下,根据数据片段内容data的顺序大小,节点N2为目标待删除的节点,节点Nk的插入位置假设亦为节点N2原先所在链表的位置。
(2)在t1时刻,由于Thread1与Thread2为并发线程,根据dummy节点查找器的工作流程,此刻操作系统内将会有两个dummy节点查找器线程实例并发启动运行,每个实例均由对应的线程所创建的,即Instance(dummy节点查找器)Thread1、Instance(dummy节点查找器)Thread2。
(3)假设两个实例Instance(dummy节点查找器)Thread1、Instance(dummy节点查找器)Thread2均为首次在操作系统内运行,根据dummy节点查找器的初始化与各个指针变量的变化过程。在t2时刻,两个实例Instance(dummy节点查找器)Thread1、Instance(dummy节点查找器)Thread2均完成了dummy节点的生成与查找,此时两个线程的dummy节点内各指针的地址如下:
currThread1:N1
tailThread1:N2
currThread2:N1
tailThread2:N2
pointerThread1:N2
pointerThread2:N2
此时由于pointerThread1以及pointerThread2指向的节点(均为节点N2)尚未含有删除标记,因此dummy节点查找器无需调用内存安全回收子模块,去回收N2节点,流程继续往下。
(4)在t2时刻,Thread2调用CAS函数,修改了节点Nk的next指针,指向了节点N3。然而,需要注意此时Thread2还未完成对N1的next指针的修改,而Thread1则调用了节点标记器子模块,对tailThread2所指向的节点N2,打上了删除标记位,注意此时Thread1并未修改链表任何节点的上下游指针。因此在t2时刻,Thread1的工作任务已完成,将执行完成的线程堆栈信息返回至操作系统。此时在计算机程序内,dummy节点查找器的pointer指针对象,已经在t2时刻被赋值指向N2。
(5)在t3时刻,Thread2继续完成对节点Nk的剩余添加流程,即将currThread2的next指针,即节点N1的next指针指向节点Nk,完成新节点的添加操作。因此在t3时刻,Thread2的工作任务完成,将执行完成的线程堆栈信息返回至操作系统。
(6)假设在后续另一个时刻t4,操作系统再次新创建了新的任务线程,例如ThreadN,那么ThreadN启动运行时亦将调用dummy节点查找器;根据dummy节点查找器的初始化与各个指针变量的变化过程,在t4时刻,ThreadN的dummy节点各指针的地址如下:
currThreadN:N1
tailThreadN:Nk
pointerThreadN:已在之前的t2时刻被赋值指向N2
(7)由于N2节点已经在上述步骤(4)中被Thread1(在t4时刻已不存在,因为已经在t2时刻完成任务并结束)创建的dummy节点查找器内的节点标记器子模块打上了删除标记,因此实例Instance(dummy节点查找器)ThreadN启用内存安全回收器子模块,先对N2节点安全地进行内存回收释放,假设整个回收流程在t5时刻完成。
(8)在t5时刻,dummy节点查找器会对dummy节点所有指针被重新初始化,此时各指针的地址如下:
currThreadN:N1
tailThreadN:Nk
pointerThreadN:清空赋值后重新赋值指向节点Nk,即currThreadN指针指向节点的下一个紧邻节点。
(9)在所有指针重新初始化完成后,ThreadN紧接着继续调用dummy节点查找器,生成新的dummy节点,此后继续根据其被指派的任务类型进行后续节点的操作流程,关于其具体流程请参见前述,此处不再不赘述。
基于上述同样的发明构思,本发明还提供一种针对无锁链表的数据处理装置,该装置可执行上述发明实施例中的方法。本发明提供的一种针对无锁链表的数据处理装置的结构可参见图10。针对无锁链表的数据处理装置1000包括处理单元1001。其中,处理单元1001用于第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点;待删除状态为执行第二任务的第二线程对第二任务目标节点进行标注的;第一任务用于对无锁链表进行第二节点的操作;第二任务用于对无锁链表中的第二任务目标节点进行删除操作;若存在待删除状态的第一节点,则从无锁链表中删除第一节点后,继续执行第一任务。
有关上述处理单元1001更详细地描述可以参考图4所示的方法实施例中相关描述直接得到,此处不再一一赘述。
基于相同的技术构思,本发明还提供了一种计算设备,如图11所示,计算设备1100包括至少一个处理器1101,以及与至少一个处理器连接的存储器1102,本发明中不限定处理器1101与存储器1102之间的具体连接介质,图11中处理器1101和存储器1102之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。
在本发明中,存储器1102存储有可被至少一个处理器1101执行的指令,至少一个处理器1101通过执行存储器1102存储的指令,可以执行前述的针对无锁链表的数据处理方法中所包括的步骤。
其中,处理器1101是计算设备的控制中心,可以利用各种接口和线路连接计算设备的各个部分,通过运行或执行存储在存储器1102内的指令以及调用存储在存储器1102内的数据,从而实现针对无锁链表的数据处理。可选地,处理器1101可包括一个或多个处理单元,处理器1101可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理下发指令。可以理解的是,上述调制解调处理器也可以不集成到处理器1101中。在一些实施例中,处理器1101和存储器1102可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。
处理器1101可以是通用处理器,例如中央处理器(central processing unit,CPU)、数字信号处理器、专用集成电路(application specific integrated circuit,ASIC)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合针对无锁链表的数据处理方法实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器1102作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器1102可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(random accessmemory,RAM)、静态随机访问存储器(static random access memory,SRAM)、可编程只读存储器(programmable read only memory,PROM)、只读存储器(read only memory,ROM)、带电可擦除可编程只读存储器(electrically erasable programmable read-only memory,EEPROM)、磁性存储器、磁盘、光盘等等。存储器1102是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明中的存储器1102还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
基于相同的技术构思,本发明还提供了一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述针对无锁链表的数据处理方法的步骤。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (12)
1.一种针对无锁链表的数据处理方法,其特征在于,所述方法包括:
第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点;所述待删除状态为执行第二任务的第二线程对第二任务目标节点进行标注的;所述第一任务用于对所述无锁链表进行第二节点的操作;所述第二任务用于对所述无锁链表中的所述第二任务目标节点进行删除操作;
若存在待删除状态的第一节点,则从所述无锁链表中删除所述第一节点后,继续执行所述第一任务。
2.如权利要求1所述的方法,其特征在于,所述确定无锁链表中是否存在标记为待删除状态的第一节点之前,还包括:
所述第二线程标注所述第二任务目标节点为待删除状态后,将所述第二任务目标节点的标识增加至标记记录中;
确定无锁链表中是否存在标记为待删除状态的第一节点,包括:
所述第一线程确定所述无锁链表中所述标记记录指示的节点是否标记有待删除状态。
3.如权利要求2所述的方法,其特征在于,所述第二线程标注所述第二任务目标节点为待删除状态,包括:
所述第二线程设置所述第二任务目标节点中下一指针的指示位为设定值,所述设定值表征为待删除状态。
4.如权利要求2所述的方法,其特征在于,所述任一线程包括临时指针,任一线程的临时指针继承在先线程的临时指针;
将所述第二任务目标节点的标识增加至标记记录中,包括:
将所述第二任务目标节点的标识添加至所述第二线程的临时指针的指向对象中。
5.如权利要求1所述的方法,其特征在于,所述第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点,包括:
第一线程在执行第一任务的过程中,遍历无锁链表中的各节点,通过每个节点中下一指针中的指示位,确定是否存在标记为待删除状态的第一节点。
6.如权利要求1-5中任一项所述的方法,其特征在于,所述确定无锁链表中是否存在标记为待删除状态的第一节点,包括:
第一线程通过创建的第一虚拟查找器模块,确定无锁链表中是否存在标记为待删除状态的第一节点;
第二线程对第二任务目标节点进行标注,包括:
第二线程通过创建的第二虚拟查找器模块,对第二任务目标节点进行标注;
从所述无锁链表中删除所述第一节点,包括:
第一线程通过所述第一虚拟查找器模块从所述无锁链表中删除所述第一节点。
7.如权利要求6所述的方法,其特征在于,任一所述虚拟查找器模块包括虚拟节点;任一所述虚拟节点包括当前指针以及尾部指针;所述第一任务用于在所述无锁链表的第一任务目标节点之前增加第二节点;
在遍历所述第一任务目标节点之后,第一虚拟节点的当前指针指向第一任务目标节点的前一节点,所述第一虚拟节点的尾部指针指向第一任务目标节点;
所述继续执行所述第一任务,包括:
通过所述第一虚拟节点的尾部指针设置所述第二节点中下一指针为所述第一任务目标节点;
通过所述第一虚拟节点的当前指针设置所述第一任务目标节点的前一节点的下一指针为所述第二节点。
8.如权利要求6所述的方法,其特征在于,所述通过所述第一虚拟查找器模块从所述无锁链表中删除所述第一节点,包括:
判断所述第一节点是否处于静默状态;
若处于静默状态,则通过所述第一虚拟查找器模块从所述无锁链表中删除所述第一节点。
9.如权利要求8所述的方法,其特征在于,判断所述第一节点是否处于静默状态,包括:
计算各线程与所述第一节点的关联系数;
根据所述第一节点的关联系数,确定所述第一节点是否处于静默状态。
10.一种针对无锁链表的数据处理装置,其特征在于,包括:
处理单元,用于第一线程在执行第一任务的过程中,确定无锁链表中是否存在标记为待删除状态的第一节点;所述待删除状态为执行第二任务的第二线程对第二任务目标节点进行标注的;所述第一任务用于对所述无锁链表进行第二节点的操作;所述第二任务用于对所述无锁链表中的所述第二任务目标节点进行删除操作;若存在待删除状态的第一节点,则从所述无锁链表中删除所述第一节点后,继续执行所述第一任务。
11.一种计算设备,其特征在于,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行如权利要求1至9中的任一项所述的方法。
12.一种计算机可读存储介质,其特征在于,所述存储介质存储有程序,当所述程序在计算机上运行时,使得计算机实现执行如权利要求1至9中的任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311855288.6A CN117707783A (zh) | 2023-12-29 | 2023-12-29 | 一种针对无锁链表的数据处理方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311855288.6A CN117707783A (zh) | 2023-12-29 | 2023-12-29 | 一种针对无锁链表的数据处理方法、装置、设备及介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117707783A true CN117707783A (zh) | 2024-03-15 |
Family
ID=90148010
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311855288.6A Pending CN117707783A (zh) | 2023-12-29 | 2023-12-29 | 一种针对无锁链表的数据处理方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117707783A (zh) |
-
2023
- 2023-12-29 CN CN202311855288.6A patent/CN117707783A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110287044B (zh) | 无锁共享内存处理方法、装置、电子设备及可读存储介质 | |
US10353749B2 (en) | Lock-free dual queue with condition synchronization and time-outs | |
US6874074B1 (en) | System and method for memory reclamation | |
US9183156B2 (en) | Read-copy update implementation for non-cache-coherent systems | |
US9280489B2 (en) | Wait-free parallel data cache | |
US9563477B2 (en) | Performing concurrent rehashing of a hash table for multithreaded applications | |
US8473950B2 (en) | Parallel nested transactions | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
US10162644B2 (en) | Shielding real-time workloads from OS jitter due to expedited grace periods | |
US11204813B2 (en) | System and method for multidimensional search with a resource pool in a computing environment | |
US10282230B2 (en) | Fair high-throughput locking for expedited grace periods | |
US10929201B2 (en) | Method and system for implementing generation locks | |
US11409447B1 (en) | System and method for implementing non-blocking, concurrent hash tables | |
US10235292B2 (en) | Method and system for implementing lock free shared memory with single writer and multiple readers | |
Ramachandran et al. | A fast lock-free internal binary search tree | |
CN104573112A (zh) | Oltp集群数据库中页面查询方法及数据处理节点 | |
US10313477B2 (en) | System and method for use of a non-blocking process with a resource pool in a computing environment | |
US12079278B2 (en) | Scalable range locks | |
US7802062B2 (en) | Non-blocking variable size recyclable buffer management | |
CN117707783A (zh) | 一种针对无锁链表的数据处理方法、装置、设备及介质 | |
CN117642735A (zh) | 数据结构中的项的版本化 | |
CN117827493A (zh) | 一种进程的数据处理方法、装置、电子设备 | |
WO2017091234A1 (en) | Providing a segmented hash map | |
WO2017095388A1 (en) | Managing an isolation context | |
WO2017095387A1 (en) | Multiple simultaneous value object |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |