CN108363624A - 一种无锁线程有序控制存储信息的方法、装置和服务器 - Google Patents

一种无锁线程有序控制存储信息的方法、装置和服务器 Download PDF

Info

Publication number
CN108363624A
CN108363624A CN201810145873.XA CN201810145873A CN108363624A CN 108363624 A CN108363624 A CN 108363624A CN 201810145873 A CN201810145873 A CN 201810145873A CN 108363624 A CN108363624 A CN 108363624A
Authority
CN
China
Prior art keywords
vernier
memory node
thread
state
shared memory
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.)
Granted
Application number
CN201810145873.XA
Other languages
English (en)
Other versions
CN108363624B (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.)
Poly Polytron Technologies Inc
Original Assignee
Poly Polytron 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 Poly Polytron Technologies Inc filed Critical Poly Polytron Technologies Inc
Priority to CN201810145873.XA priority Critical patent/CN108363624B/zh
Publication of CN108363624A publication Critical patent/CN108363624A/zh
Application granted granted Critical
Publication of CN108363624B publication Critical patent/CN108363624B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/522Barrier synchronisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/542Event management; Broadcasting; Multicasting; Notifications

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及数据存储技术领域,提供一种无锁线程有序控制存储信息的方法、装置和服务器。所述方法包括:根据循环队列中共享存储节点的发布状态,在至少两个第一线程中的焦点线程从共享存储节点中读取当前数据期间调用CAS指令;当当前数据读取结束时,发布状态修改为非发布状态,非发布状态用于指示第一线程可在当前数据之后存入在后数据;为第一线程分配处于非发布状态的共享存储节点;根据共享存储节点在循环队列中的存储位置和CAS指令中原游标的一致性,以新游标更新原游标,新游标等于原游标和单向量之和。如此,可以控制线程有序存取数据,克服对存储队列控制时产生的额外开销,提高线程并发效率。

Description

一种无锁线程有序控制存储信息的方法、装置和服务器
技术领域
本发明涉及数据存储技术领域,尤其涉及一种无锁线程在循环队列中控制存储信息的方法和装置。
背景技术
在相关技术中,为了避免应用或者操作***的线程从存储队列中同时读写存储数据而造成数据冲突,采用对线程加锁的方式控制其串行执行读写操作,由于在持有锁的线程释放锁后,挂起的线程才能加锁以串行读写存储数据,限制了存储队列的并发效率,所以采用无锁线程方式明显更高效。
为了使无锁线程有序读写存储数据,针对存储队列有阻塞或非阻塞算法,但都必须保证并发线程同步访问同一存储节点(为了便于描述,下称共享存储节点)以维持存储队列的完整性,分别通过延迟队列(如:生成并检验额外增加的唯一编码)或者限制多线程在有限步骤(如:增加虚节点并控制其出入列)内完成对存储队列中共享存储节点的操作,从而增加了额外开销。
在一些情形下,如在服务器上较多线程需要在存储队列中频繁读写存储节点时,突出的额外开销也会降低并发效率。
发明内容
有鉴于此,本发明提供一种,解决如何在克服额外开销的基础上,对无锁线程从存储队列中存储节点有序读写信息进行控制,以提高线程并发效率。
具体地,本发明通过如下技术方案实现:
第一方面,本发明提供一种无锁线程在循环队列中控制存储信息的方法,该方法包括以下具体步骤:
根据循环队列中共享存储节点的发布状态,在至少两个第二线程中的焦点线程从共享存储节点中读取当前数据期间调用CAS指令;当读取当前数据结束时,发布状态修改为非发布状态,非发布状态用于指示第一线程可在当前数据之后存入在后数据;为第一线程分配处于非发布状态的共享存储节点;根据共享存储节点在循环队列中的存储位置和CAS指令中原游标的一致性,以新游标更新原游标,新游标等于原游标和单向量之和。
可选地,当焦点线程开始读取当前数据时,焦点线程发送通知信息,通知信息中携带用于唯一标识存储位置的存储编号;
根据通知信息调用CAS指令。
可选地,基于第一线程向共享存储节点中存入在后数据的数据分量,非发布状态切换至所述发布状态。
可选地,当在后数据少于共享存储节点中数据总量时,非发布状态中的独占状态切换至发布状态,独占状态用于指示第一线程可向共享存储节点中续存在后数据;当在后数等于共享存储节点中数据总量时,非发布状态中的独占状态切换至发布状态。
可选地,当前述存储位置与原游标一致时,以新游标替换原游标。
可选地,当共享存储节点为循环队列中尾节点时,将单向量从正向量修改为负向量,单向量中的预设步长为1;以等于原游标与负向量之和的新游标更新原游标。
可选地,当共享存储节点为循环队列中尾节点时,将新游标设置为循环队列中首节点对应的存储位置。
可选地,当存储位置和原游标不一致时,向焦点线程反馈用于指示停止读取当前数据的通知信息。
可选地,向所述焦点线程反馈用于指示续读当前数据的通知信息。
第二方面,基于相同的构思,本发明还提供一种无锁线程在循环队列中控制存储信息的装置,该装置包括以下具体单元:
指令调用单元,用于循环队列中共享存储节点的发布状态,在至少两个第一线程中的焦点线程从共享存储节点中读取当前数据期间调用CAS指令;状态修改单元,用于当读取当前数据结束时,发布状态修改为非发布状态,非发布状态用于指示第一线程可在当前数据之后存入在后数据;节点分配单元,用于为第一线程分配处于非发布状态的所述共享存储节点;游标更新单元,用于根据共享存储节点在循环队列中的存储位置和CAS指令中原游标的一致性,以新游标更新原游标,新游标等于原游标和单向量之和。
第三方面,基于相同的构思,本申请还提供一种服务器,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行上述程序时实现以下步骤,该步骤包括第一方面任一所述的方法步骤。
第四方面,基于相同的构思,本申请还提供一种计算机存储介质,计算机可读存储介质中存储有CAS指令和至少一个或者一组其他指令,执行CAS指令和其他指令时可实现以下步骤,该步骤包括第一方面中任一所述的方法步骤。
本发明实施例提供的技术方案带来的有益效果是:
相比于现有技术,本申请为了向循环队列中有序存入数据,在共享存储节点处于发布状态下,通过至少两个第二无锁线程相互抢占共享存储节点并在焦点线程从其中读取当前数据期间调用CAS指令,利用CAS指令以单向量所指示的方向将原游标更新为新游标,可以为焦点线程锁定共享存储节点,与焦点线程不同的其他第二线程利用CAS指令验证原游标不一致,从而无法操作共享存储节点,使其他第二线程不再继续抢占共享存储节点,在此基础上,通过共享存储节点从发布状态到非发布状态的变化,结合被动分配方式使第一线程和第二线程串行控制共享存储节点,如此减少多个线程有序存取数据时的额外开销,提高并发效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一中提供的一种无锁线程在循环队列中控制存储信息的流程示意图;
图2a是本发明实施例一提供的线程控制存储节点2状态的示意图;
图2b是图2a中线程存入数据后游标移动的示意图;
图2c是图2b中存储节点3从非发布状态转换为发布状态的示意图;
图3是本发明实施例一提供的控制存储信息的另一种流程示意图;
图4a是本发明实施例一提供的多线程抢占存储节点4的示意图;
图4b是图4a中多线程并发从循环队列中有序存取数据的示意图;
图4c是图4b中线程存取数据后存储节点的状态变化示意图;
图5是本发明实施例二提供的一种无锁线程在循环队列中控制存储信息的流程示意图;
图6本发明实施例二提供的控制存储信息的另一种流程示意图;
图7a至7c是实施例二提供的存储队列中存储节点状态变化的示意图;
图8为本发明实施例三提供一种无锁线程在循环队列中控制存储信息的装置示意图;
图9为本发明实施例三提供另一种无锁线程在循环队列中控制存储信息的装置示意图;
图10提供本发明实施例四提供的一种服务器的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
技术术语解释
循环队列是指以单链表方式链接不同存储节点且可供焦点线程向单向量所指示的方向控制共享存储节点的存储队列。
游标是指以共享存储节点的存储地址为参数表征且用于指示存储节点在循环队列中的存储位置,以供并发线程抢占存储节点。
共享存储节点是指循环队列中可供至少两个并发线程抢占的节点,以使抢占到该节点的线程向其中存入或读取数据。
焦点线程是指并发线程中抢占到共享存储节点的线程且该线程可在原游标更新后持续在抢占期间对共享存储节点的控制。
实施例一
在一些情形下,诸如分布式客户端基于用户购买商品行为集中生产支付订单,并将支付订单发送给服务器,服务器处理各个支付订单,为了提高用户消费体验,需要服务器及时存储支付订单中消费数据,给予客户端反馈。此时,存储消费数据的并发无锁线程会频繁抢占共享存储节点,存储节点也会从存储队列中频繁出入列,相应地,服务器中多线程读取消费数据也会增加出入列的频率,此时为了考虑存储队列中数据结构的完整性而增加虚节点或者与额外标识,会降低并发效率。
为了提高上述情形下线程的并发效率,如图1所示,本发明提供一种无锁线程在循环队列中控制存储信息的方法的流程图,该方法包括以下具体步骤:
步骤S110:根据循环队列中共享存储节点的非发布状态,在至少两个第一线程中的焦点线程向共享存储节点存入当前数据期间调用CAS指令;
在本实施例中,循环队列中包括多个存储节点,以有无“发布”字符串区分各个存储节点的发布状态和非发布状态,其中,仅在处于发布状态的存储节点中允许线程在其中读取存储数据,且禁止线程向其中存入存储数据。
如图2a所示,循环队列200包括存储节点1-4,其中,存储节点2中存储有发布且其他存储节点未存储,此时存储节点1、3和4为非发布状态,以及存储节点2为发布状态,并行线程中线程1可以从存储节点2中读取存储数据a,并且禁止线程2向存储节点2中存入存储数据,如此可以避免不同线程在同一存储节点中同时存取数据。
向存储节点中存入当前数据的线程为第一线程,从存储节点中读取数据的线程为第二线程,第一线程和第二线程可以并发拉起,因此针对线程拉起的随机性,前述两个线程是并行线程,但是针对在发布状态下的同一存储节点中存取存储数据的共享性,第一线程和第二线程为串行线程。
多个并行的第一线程可以自由抢占同一存储节点(下称共享存储节点),以向非发布状态下的共享存储节点中存入当前数据,也可由操作***中的调度线程调度多个第一线程,在先抢占到共享存储节点的焦点线程存入当前数据期间,调用比较和替换(CAS)指令,并根据该指令中原游标和共享存储节点在循环队列中的当前存储位置之间的同一性,以单向量修改该原游标,单向量可以用于指示原游标从循环队列中首节点向尾节点移动的方向。
如图2b所示,在共享存储节点3为非发布状态时,两个第一线程同时抢占,第一线程2抢占到可向共享存储节点3中存入当前数据a3,第一线程1禁止向其中存入数据,其实现是在第一线程2开始存入数据时调用CAS指令,在CAS指令中比较存储下标3和原游标3一致,将原游标修改为新游标4,新游标4等于原游标3加上单向量1,其他第一线程1继续争抢共享存储节点3,CAS指令中更新后的原游标4与存储位置3不一致,则不执行与第一线程1对应的存储数据,使焦点线程锁定共享存储节点。
焦点线程在共享存储节点中存入当前数据期间,通过与至少两个第一线程不同的调度线程禁止其他第一线程争抢焦点存储节点,可以进一步确保第一线程锁定存储节点。
步骤S120:当当前数据存入结束时,非发布状态修改为发布状态。
针对共享存储节点中有序存取当前数据,通过发布状态的变化可以使第一线程和第二线程对该存储节点分时控制,以减小存取之间的数据冲突,第一线程向处于非发布状态的存储节点存入数据结束,立即将该非发布状态替换为发布状态,第二线程从其中读取存入的数据,此时发布状态用于指示与第一线程串行的第二线程可读取前述当前数据,当前数据需要在第二线程唤醒后才能读取,参考图2b所示,其中,原游标更新后的新游标即转换为原游标,其指向的存储节点4为共享存储节点,第一线程1抢占共享存储节点4。
步骤S130:为第二线程分配处于发布状态的共享存储节点。
在将非发布状态修改为发布状态之后且在第二线程唤醒之前,通过调度线程为第二线程分配处于发布状态的共享存储节点;抑或是,共享存储节点由非发布状态转换到发布状态时立即唤醒第二线程,使其读取该存储节点中的存储数据。
在线程池中存储配置有不同优先级的多个第二线程,按照优先级和存储节点所处循环队列中存储地址的从高到低顺序,将各个第二线程与存储节点绑定;或者,以优先级和存储地址的对应大小生成映射表,并将该映射表存储在线程池中,如此可以保证不同第二线程对处于发布状态的存储节点读取有序性,以减小读取数据的冲突,本领域技术人员根据上述描述即可实现,此处不再赘述。
步骤S140:根据共享存储节点在循环队列中的存储位置和CAS指令中原游标的一致性,以单向量更新原游标,使焦点线程锁定共享存储节点。
第一线程开始向其抢先得到的共享存储节点中存入当前数据时,发送通知信息,该通知信息中携带共享存储节点位于循环队列的当前存储位置,根据通知信息调用CAS指令。
CAS指令中存储的三个参数,分别为原游标、期望值和新游标,调用CAS指令时通知信息中携带的当前存储地址存入期望值,判断当前存储地址和原游标是否相同;若相同,则以新游标修改原游标,该新游标指向与原游标指向存储节点不同的目标存储节点,以使其他第一线程可对目标存储节点执行存储操作;若不相同,不修改或回滚原游标,表示共享存储节点与原游标指向的存储节点不对应,此时禁止第一线程存入存储数据,如此保证第一线程之间存入数据的有序性。
在焦点线程向共享存储节点中存入数期间,其他第一线程可能会继续抢占,以期在共享存储节点中存入存储数据,但焦点线程先调用CAS指令,会提前锁定该共享存储节点,而其他第一线程调用CAS指令时再发送通知信息,此时CAS指令中的原游标已经更新,则会使其他第一线程停止存入存储数据。
在修改原游标后,其他第一线程自由抢占新游标对应在循环队列中的存储节点,与此同时,在原游标对应的存储节点中第一线程续存当前数据,不同的第一线程可以并行对不同存储节点存入数据,以使第一线程之间减少数据冲突,并且针对循环队列中不同存储节点,实现第一线程并行存入存储数据,提高并发效率。
如图2c所示,第一线程2在与原游标对应的存储节点3中存入存储数据a3结束时,在存储节点3中存入“发布”字符串,使其从非发布状态转换为发布状态,并且在转换状态之前将原游标替换为新游标,第一线程1竞争得到新游标对应的存储节点4,此时存储节点4为非发布状态。
作为一种可选的实施方式,如图3所示。
步骤S310:当循环队列中与原游标对应的共享存储节点处于非发布状态时,多个第一线程抢占共享存储节点并在存入当前数据期间焦点线程发送通知信息。
至少三个第一线程之间相互竞争,竞争得到向共享存储节点中抢先存入数据的第一进程为焦点线程,该共享存储节点处于非发布状态。
非发布状态可以包括空闲状态和独占状态,空闲状态用于表征共享存储节点中已存在存储数据,独占状态用于表征其中未存入存储数据,可以在未存入存储数据的状态下,在共享存储节点中存入“空闲”字符串,相应地,已经存在存储数据(下称在先数据)的状态下,在其中存入“独占”字符串。
在共享存储节点为独占状态或者空闲状态时,且焦点线程开始存入数据时,发送通知信息,以调用CAS指令,如此减小调用的时差尽快改变原游标。
如图4a所示,三个第一线程1-3竞争循环队列400中原游标对应的共享存储节点4,共享存储节点4中存储有表示其处于空闲状态的“空闲”字符串。
步骤S320:当通知信息中携带共享存储节点的存储编号与CAS指令中原游标相同时,以新游标替换原游标,新游标等于原游标和单向量之和。
根据携带有前述共享存储节点中当前存储位置的通知消息调用CAS指令,CAS指令中期望值修改为当前存储位置,当当前存储位置和原游标相同时,以前述新游标替换原游标,以及向第一线程反馈用于指示可对与新游标对应存储节点抢占的第一通知消息;当当前存储位置和原游标不同时,维持原游标,以及向第一线程反馈用于指示停止向共享存储节点中存入存储数据的第二通知消息,以使得第一线程可以主动感知彼此对共享存储节点操作的权限,不反复发送通知信息,造成重复调用CAS指令。
焦点线程接收到第一通知信息时,向共享存储节点中续存当前数据。
除在循环队列中的尾节点外,新游标可以是在原游标的基础上加上单向量,该单向量默认为正向量且预设步长为1,当原游标等于循环队列的总长度时,表征原游标指向的共享存储节点为尾节点,此时将新游标设置为循环队列中首节点的存储位置,如此可以保证循环队列中存储节点的有序性和一致性。
如图4b所示,第一线程3抢先可向共享存储节点4中存入当前数据a4的优先权,在存入a4期间,通过CAS指令将原游标替换为新游标,共享存储节点4为循环队列410的尾端节点,此时将原游标减去存储节点的总数4,设置首端节点的下标1为新游标;第一线程3接收到通过CAS指令反馈的通知信息1时,则保持向共享存储节点4中存入当前数据,待存入结束时将“空闲”修改为“发布”;否则,当接收到第二通知信息时,第一线程3停止存入数据a4,并且第二线程1和2分别从存储节点2和3读取在先数据。
或者,当共享存储节点为前述尾节点时,将预设步长修改为相反矢量,并且根据相反矢量与共享存储节点的存储位置和原游标之和更新,例如:共享存储节点的下标为4时,预设步长1修改为-1,新游标为4-1=3
步骤S330:当当前数据存入结束时,非独占状态中的独占状态或者空闲状态修改为发布状态。
步骤S340:为第二线程分配处于发布状态的共享存储节点。
线程池中各个第二线程分别与循环队列中存储节点绑定,当从独占状态或者空闲状态转换为发布状态时,与共享存储节点绑定的第二线程读取其中的存储数据。
根据第二线程读取存储数据的分量与共享存储节点中存储数据的总量之间的大小关系,将发布状态转换为独占状态或者空闲状态;当前述分量小于总量时,以“独占”字符串替换“发布”字符串;当前述两者相等时,以“空闲”字符串替换“发布”字符串。
结合图4b和图4c所示,第二线程1从存储节点2中读取数据为a2-1,a2-1小于a2,读取结束时将“发布”修改为“独占”;第二线程2从存储节点3中读取数据为a3,读取结束时将“发布”修改为“空闲”。
需要说明的是,至少两个第一线程相互竞争对共享存储节点的优先权限此时拥有优先权限的当前第一线程可以并行存入存储数据和调用CAS指令,而调用CAS指令的首要作用是改变原游标,以使当前第一线程锁定该共享存储节点,并且其他第一线程互为竞争与新游标对应存储节点的优先权。因此,可以并行修改前述非发布状态和原游标,本领域技术人员也可以根据前述实施方式组合,以使得两个过程串行。
实施例二
在一些情形下,诸如分布式客户端通过与服务器之间的通信交互共享弹幕信息,一个客户端上基于用户编辑行为生产的弹幕信息发送给服务器,服务器基于其他客户端上视频请求反馈该弹幕信息,使分布式客户端共享,客户端上集中播放直播视频,此时服务器上读取弹幕信息且将弹幕信息***到直播视频,在服务器和分布式客户端之间交互频繁时,不同弹幕信息也需要不断***到直播视频。
为了提高上述情形下线程并发效率,如图5所示,本申请提供另一种无锁线程在循环队列中控制存储信息的方法,具体步骤如下。
步骤S510:根据循环队列中共享存储节点的发布状态,在至少两个第二线程中的焦点线程向共享存储节点中读取当前数据期间调用CAS指令。
在本实施例中,焦点线程为至少两个第二线程中抢占到共享存储节点的线程,根据循环存储队列中各个存储节点的发布状态,调度线程可以对至少两个第二线程进行调度,焦点线程在共享存储节点中读取当前数据期间向CPU发送通知消息,根据通知消息调用CAS指令,读取当前数据可以是对当前数据进行复制。
其中,CAS指令可以是CPU中的原子性数据运算,相对于现有技术在操作***中对线程加锁的方式,原子性数据运算可以加快CAS机制运行,如:操作***中每秒10w计算,CAS机制可以达到100w计算。
步骤S520:当共享存储节点在循环队列中的存储位置和CAS指令中原游标相同时,以单向量更新原游标,使焦点线程锁定共享存储节点。
根据调用的CAS指令和共享存储节点在循环队列中的存储下标之间的一致性,当两者相同时,以新游标更新原游标,新游标等于原游标和单向量之和,单向量可以为1,使焦点线程锁定共享存储节点。
在原游标更新后,焦点线程和其他第二线程接收共享信息,焦点线程向共享存储节点中续读当前数据,并且第一线程根据共享信息中携带的新游标,抢占与新游标对应的存储节点。
步骤S530:当焦点线程读取当前数据结束时,发布状态修改为非发布状态。
建立存储节点及其状态的信息描述表,在该信息描述表中包括存储节点的存储地址和状态信息之间的映射关系,该状态信息包括用于表征发布状态的1和非发布状态的2,如表1所示。
表1
下标 状态
1 2
2 1
3 1
4 2
n 1
非发布状态可以包括空闲状态和独占状态,空闲状态可以2-1表征且独占状态可以2-2表征,在信息描述表中还可以存储前述优先级和存储地址之间的映射关系,如表2所示。
表2
下标 线程优先级 状态
1 1 2-2
2 2 2-2
3 3 2-1
4 4 1
n N 2-2
非发布状态用于指示第一线程在当前数据之前存入在先数据,并且可在当前数据之后存入在后数据,其中,独占状态用于指示第一线程在当前数据之续存在后数据,空闲状态用于指示共享存储节点中不存在在先数据,第一线程可以直接向其中存入当前数据。
步骤S540:为第一线程分配处于非发布状态的共享存储节点。
第一线程可以监听循环队列中共享存储节点的状态,在监听到共享存储节点从发布状态切换到非发布状态之后,基于第一线程向共享存储节点中存入在后数据的数据分量,非发布状态切换至所述发布状态;当在后数据少于共享存储节点中数据总量时,非发布状态中的独占状态切换至发布状态,独占状态用于指示第一线程可向共享存储节点中续存在后数据;当在后数据与前述数据总量相等时,非发布状态中的空闲状态切换至发布状态;其中,在后数据为在当前数据之后存入共享存储节点的数据,在当前数据之前存入共享存储节点的数据为在先数据。
作为另一个可选的实施方式,如图6所示。
步骤S610:根据循环队列中共享存储节点的发布状态,在至少两个第二线程中的焦点线程向共享存储节点中读取存储数据期间调用CAS指令。
步骤S620:当读取当前数据结束时,发布状态修改为非发布状态。
步骤S630:为第一线程分配处于非发布状态的存储节点。
步骤S640:当与共享存储节点对应的存储位置和CAS指令中的原游标相同,以新游标修改原游标,新游标等于单向量和原游标之和。
示范性的,如图7a至7c所示,在循环队列710初始化后各个存储节点均为空闲状态,并分别与线程池1012中第一线程1-4绑定,第一线程1-4的优先级依次降低(向箭头指向方向升高);在多个第一线程和第二线程从循环队列1011中存取数据过程中,并发的第二线程1和2抢占从空闲状态转化为发布状态的存储节点1,以在第一线程1向存储节点1中存入数据后复制该数据,并且第一线程1在线程池1012中终止且拉起第一线程5,第一线程5的优先级低于第一线程4,如图7b;第二线程1和2中抢占到存储节点1的线程,从其中复制数据a1,如图7c所示,复制结束后,存储节点1从发布状态转换为独占状态,并将处于独占状态的存储节点1与线程5绑定。
需要说明的是,实施例二中对存储节点及其所处状态、线程从存储节点中存取数据等与实施例一中相应部分描述类似,本领域技术人员可以基于实施例一、二相互结合扩展具体实施方式,此处不再赘述。
实施例三
基于相同的构思,本发明实施例二还提供一种处理资源数据的装置,该装置可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,本发明的处理测试数据的装置作为一个逻辑意义上的装置,是通过其所设备的CPU将存储器中对应的计算机程序指令读取后运行而成。
本发明一种示例性实施方式中的一种无锁线程在循环队列中控制存储信息的装置,该装置基本运行环境包括CPU,存储器以及其他硬件,从逻辑层面上来看,该装置800的逻辑结构如图8所示,其中包括:指令调用单元810、状态修改单元820、节点分配单元830和游标更新单元840。
示例一
指令调用单元810,用于根据循环队列中共享存储节点的非发布状态,在至少两个第一线程中的焦点线程向共享存储节点存入当前数据期间调用CAS指令;
状态修改单元820,用于当当前数据存入结束时,非发布状态修改为发布状态,发布状态用于指示第二线程可读取当前数据;
节点分配单元830,用于为第二线程分配处于发布状态的存储节点;
游标更新单元840,用于根据共享存储节点在循环队列中的存储位置和CAS指令中原游标的一致性,以单向量更新原游标,为焦点线程锁定共享存储节点。
示例二
指令调用单元910,用于根据循环队列中共享存储节点的发布状态,在至少两个第二线程中的焦点线程向共享存储节点中读取当前数据期间调用CAS指令;
游标更新单元920,用于当共享存储节点在循环队列中的存储位置和CAS指令中原游标相同时,以单向量更新原游标,使焦点线程锁定共享存储节点;
状态修改单元930,用于当焦点线程读取当前数据结束时,发布状态修改为用于指示第一线程可在当前数据之后存入在后数据的非发布状态;
节点分配单元940,用于为第一线程分配处于非发布状态的共享存储节点。
指令调用单元可以包括消息发送单元和调用单元,消息发送单元用于当焦点线程开始读取当前数据时,发送同通知消息;调用单元用于接收通知消息并响应于通知消息而调用CAS指令。
游标更新单元可以包括原游标、期望值和新游标,期望值用于存储通知消息中携带的共享存储节点在循环队列中的存储地址,新游标等于原游标和单向量之和;当共享存储节点对应在循环队列中的存储地址和CAS指令中原游标相同时,以新游标替换原游标,并且向焦点线程反馈用于指示向共享存储节点中续读当前数据的第三通知消息;当前述存储地址和原游标不相同时,向焦点线程反馈用于指示停止向共享存储节点中读取的第四通知消息。
其中,单向量默认为正向量1,当共享存储节点为循环队列中的尾节点时,可以从正向量转换为负向量,或者设置新游标为存储队列中的首节点。
状态修改单元930可以包括第一修改单元和第二修改单元,第一修改单元用于当第一线程存入的当前数据小于存入当前数据后共享存储节点中数据总量时,将非发布状态中的独占状态修改为发布状态;第二修改单元用于当第一线程存入的当前数据等于存入当前数据后共享存储节点中数据总量时,将非发布状态中的空闲状态修改为发布状态。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
实施例四
参考图10所示,本发明实施例三还提供一种服务器1000,服务器1000可以是订单服务器和视频服务器,包括存储器1100和通过控制总线1200与存储器1100连接的处理器1300,连接在控制总线1200上的通信接口1400可与客户端或其他服务器进行通信,在存储器1100中存储计算机程序,该计算机程序可运行在处理器1200中,当计算机程序运行时实现实施例一中描述的步骤和功能。
本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

Claims (11)

1.一种无锁线程在循环队列中控制存储信息的方法,其特征在于,所述方法包括:
根据循环队列中共享存储节点的发布状态,在至少两个第二线程中的焦点线程从所述共享存储节点中读取当前数据期间调用CAS指令;
当所述当前数据读取结束时,所述发布状态修改为非发布状态,所述非发布状态用于指示第一线程可在所述当前数据之后存入在后数据;
为所述第一线程分配处于所述非发布状态的所述共享存储节点;
根据所述共享存储节点在所述循环队列中的存储位置和所述CAS指令中原游标的一致性,以新游标更新所述原游标,所述新游标等于所述原游标和单向量之和。
2.根据权利要求1所述的方法,其特征在于,所述根据循环队列中共享存储节点的发布状态,在至少两个第二线程中的焦点线程从所述共享存储节点中读取当前数据期间调用CAS指令,包括:
当所述焦点线程开始读取所述当前数据时,所述焦点线程发送通知信息,所述通知信息中携带用于唯一标识所述存储位置的存储编号;
根据所述通知信息调用所述CAS指令。
3.根据权利要求1所述的方法,其特征在于,在所述为所述第一线程分配处于所述非发布状态的所述共享存储节点之后,包括:
基于所述第一线程向所述共享存储节点中存入所述在后数据,所述非发布状态切换至所述发布状态。
4.根据权利要求3所述的方法,其特征在于,所述基于所述第一线程向所述共享存储节点中存入所述在后数据,所述非发布状态切换至所述发布状态,包括:
当所述在后数据少于所述共享存储节点中数据总量时,所述非发布状态中的独占状态切换至所述发布状态,所述独占状态用于指示所述第一线程向所述共享存储节点中续存所述在后数据;
当所述在后数据等于所述共享存储节点中数据总量时,所述非发布状态中的独占状态切换至所述发布状态。
5.根据权利要求1-3所述的方法,其特征在于,所述根据所述共享存储节点在所述循环队列中的存储位置和所述CAS指令中原游标的一致性,以新游标更新所述原游标,包括:
当所述存储位置与所述原游标一致时,以所述新游标替换所述原游标。
6.根据权利要求1-3所述的方法,其特征在于,所述根据所述共享存储节点在所述循环队列中的存储位置和所述CAS指令中原游标的一致性,以新游标更新所述原游标,包括:
当所述共享存储节点为所述循环队列中尾节点时,将所述单向量从正向量修改为负向量;
以等于所述原游标与所述负向量之和的新游标更新所述原游标。
7.根据权利要求1-3所述的方法,其特征在于,在根据所述共享存储节点在所述循环队列中的存储位置和所述CAS指令中原游标的一致性,以新游标更新所述原游标中,包括:
当所述共享存储节点为所述循环队列中尾节点时,将所述新游标设置为所述循环队列中首节点对应的存储位置。
8.根据权利要求1-3所述的方法,其特征在于,所述根据所述共享存储节点在所述循环队列中的存储位置和所述CAS指令中原游标的一致性,以新游标更新所述原游标,包括:
当所述存储位置和所述原游标不一致时,向所述焦点线程反馈用于指示停止读取所述当前数据的通知信息。
9.根据权利要求4所述的方法,其特征在于,所述当所述存储位置与所述原游标一致时,以所述新游标替换所述原游标,包括:
向所述焦点线程反馈用于指示续读所述当前数据的通知信息。
10.一种无锁线程在循环队列中控制存储信息的装置,其特征在于,所述装置包括:
指令调用单元,用于根据循环队列中共享存储节点的发布状态,在至少两个第二线程中的焦点线程从所述共享存储节点中读取当前数据期间调用CAS指令;
状态修改单元,用于当所述当前数据读取结束时,所述发布状态修改为非发布状态,所述非发布状态用于指示第一线程可在所述当前数据之后存入在后数据;
节点分配单元,用于为所述第一线程分配处于所述非发布状态的所述共享存储节点;
游标更新单元,用于根据所述共享存储节点在所述循环队列中的存储位置和所述CAS指令中原游标的一致性,以新游标更新所述原游标,所述新游标等于所述原游标和单向量之和。
11.一种服务器,其特征在于,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于:所述处理器执行上述程序时实现以下步骤,该步骤包括权利要求1-9所述方法步骤。
CN201810145873.XA 2018-02-12 2018-02-12 一种无锁线程有序控制存储信息的方法、装置和服务器 Active CN108363624B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810145873.XA CN108363624B (zh) 2018-02-12 2018-02-12 一种无锁线程有序控制存储信息的方法、装置和服务器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810145873.XA CN108363624B (zh) 2018-02-12 2018-02-12 一种无锁线程有序控制存储信息的方法、装置和服务器

Publications (2)

Publication Number Publication Date
CN108363624A true CN108363624A (zh) 2018-08-03
CN108363624B CN108363624B (zh) 2022-04-19

Family

ID=63005769

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810145873.XA Active CN108363624B (zh) 2018-02-12 2018-02-12 一种无锁线程有序控制存储信息的方法、装置和服务器

Country Status (1)

Country Link
CN (1) CN108363624B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112559496A (zh) * 2020-12-24 2021-03-26 百果园技术(新加坡)有限公司 一种分布式数据库事务原子性实现方法及装置
CN113377509A (zh) * 2021-06-08 2021-09-10 上海哔哩哔哩科技有限公司 数据处理方法与***

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020166016A1 (en) * 2001-05-02 2002-11-07 International Business Machines Corporation Efficient locking for thread-safe self-modifying code
US20070169123A1 (en) * 2005-12-30 2007-07-19 Level 3 Communications, Inc. Lock-Free Dual Queue with Condition Synchronization and Time-Outs
US8095727B2 (en) * 2008-02-08 2012-01-10 Inetco Systems Limited Multi-reader, multi-writer lock-free ring buffer
CN102331923A (zh) * 2011-10-13 2012-01-25 西安电子科技大学 一种基于多核多线程处理器的功能宏流水线实现方法
CN103713884A (zh) * 2013-12-18 2014-04-09 珠海金山网络游戏科技有限公司 多线程通过数组处理数据的方法、***及多线程处理器
CN104077113A (zh) * 2014-07-10 2014-10-01 中船重工(武汉)凌久电子有限责任公司 一种无锁并发消息处理机制的实现方法
US9069566B1 (en) * 2012-02-22 2015-06-30 Hudku Technosoft Private Limited Implementation of a multiple writer single reader queue in a lock free and a contention free manner
CN105659208A (zh) * 2013-11-01 2016-06-08 Arm 有限公司 处理多个线程的数据处理装置及方法
CN105868031A (zh) * 2016-03-24 2016-08-17 车智互联(北京)科技有限公司 一种数据传输装置和方法
CN106648461A (zh) * 2016-11-15 2017-05-10 努比亚技术有限公司 一种内存管理装置和方法

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020166016A1 (en) * 2001-05-02 2002-11-07 International Business Machines Corporation Efficient locking for thread-safe self-modifying code
US20070169123A1 (en) * 2005-12-30 2007-07-19 Level 3 Communications, Inc. Lock-Free Dual Queue with Condition Synchronization and Time-Outs
US8095727B2 (en) * 2008-02-08 2012-01-10 Inetco Systems Limited Multi-reader, multi-writer lock-free ring buffer
CN102331923A (zh) * 2011-10-13 2012-01-25 西安电子科技大学 一种基于多核多线程处理器的功能宏流水线实现方法
US9069566B1 (en) * 2012-02-22 2015-06-30 Hudku Technosoft Private Limited Implementation of a multiple writer single reader queue in a lock free and a contention free manner
CN105659208A (zh) * 2013-11-01 2016-06-08 Arm 有限公司 处理多个线程的数据处理装置及方法
CN103713884A (zh) * 2013-12-18 2014-04-09 珠海金山网络游戏科技有限公司 多线程通过数组处理数据的方法、***及多线程处理器
CN104077113A (zh) * 2014-07-10 2014-10-01 中船重工(武汉)凌久电子有限责任公司 一种无锁并发消息处理机制的实现方法
CN105868031A (zh) * 2016-03-24 2016-08-17 车智互联(北京)科技有限公司 一种数据传输装置和方法
CN106648461A (zh) * 2016-11-15 2017-05-10 努比亚技术有限公司 一种内存管理装置和方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112559496A (zh) * 2020-12-24 2021-03-26 百果园技术(新加坡)有限公司 一种分布式数据库事务原子性实现方法及装置
CN113377509A (zh) * 2021-06-08 2021-09-10 上海哔哩哔哩科技有限公司 数据处理方法与***

Also Published As

Publication number Publication date
CN108363624B (zh) 2022-04-19

Similar Documents

Publication Publication Date Title
CN104750543B (zh) 线程创建方法、业务请求处理方法及相关设备
US9703610B2 (en) Extensible centralized dynamic resource distribution in a clustered data grid
EP3404540A1 (en) Data stream processing method, apparatus, and system
Kash et al. No agent left behind: Dynamic fair division of multiple resources
JP5516744B2 (ja) スケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法
CN105242872B (zh) 一种面向虚拟集群的共享存储***
CN105302497B (zh) 一种缓存管理方法与***
CN104601680B (zh) 一种资源管理方法及装置
JP2019535072A (ja) 複数の購読者にメッセージを提供するためのシステム及び方法
CN102831018B (zh) 低延迟先进先出消息交换***
JP2009187115A (ja) マルチノード・サーバシステム、負荷分散方法、リソース管理サーバ、およびプログラム
CN105094751A (zh) 一种用于流式数据并行处理的内存管理方法
CN108363624A (zh) 一种无锁线程有序控制存储信息的方法、装置和服务器
CN108363625A (zh) 一种无锁线程有序控制存储信息的方法、装置和服务器
JP2009059310A (ja) プログラム制御装置
KR20150122119A (ko) 동시 우선순위 큐에서 시퀀서를 이용하는 시스템 및 방법
CN108376103A (zh) 一种云平台的资源平衡控制方法及服务器
CN113434282A (zh) 流计算任务的发布、输出控制方法及装置
CN108595259A (zh) 一种基于全局管理的内存池管理方法
US10817512B2 (en) Standing queries in memory
CN109639460B (zh) Nfv资源管理的方法和装置
JP2018133758A (ja) 仮想マシン間通信システム
JP2006197104A (ja) 給電管理サーバ、ip電話システム、給電管理方法およびプログラム
JP6197692B2 (ja) サーバ
JP2006079463A (ja) 時系列データ記録用バッファ管理方法、装置、システムおよびプログラム

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