一种队列数据控制方法、系统及队列数据结构技术方案

技术编号:30025247 阅读:22 留言:0更新日期:2021-09-11 06:54
本申请公开了一种队列数据控制方法,包括:设置循环队列,循环队列包括至少一个地址,地址用于存储元素;设置插入失败计数器,用于记录循环队列中插入元素失败的地址;设置取出失败计数器,用于记录循环队列中取出元素失败的地址;设置插入失败计数器操作锁和取出失败计数器操作锁;进行入队操作时,若检查取出失败计数器中存在取出元素失败事件的记录,则锁定取出失败计数器操作锁,删除取出元素失败事件的记录后释放取出失败计数器操作锁,并重新获取队尾指针;进行出队操作时,若检查插入失败计数器中存在插入元素失败事件的记录,则锁定插入失败计数器操作锁,删除插入元素失败事件的记录后释放插入失败计数器操作锁,并重新获取队头指针。获取队头指针。获取队头指针。

【技术实现步骤摘要】
一种队列数据控制方法、系统及队列数据结构


[0001]本申请属于计算机
,尤其涉及一种队列数据控制方法、系统及队列数据结构。

技术介绍

[0002]并发程序是指由若干个可同时执行的程序模块组成的程序,这种可同时执行的程序模块被称为线程。组成一个程序的多个线程可以同时在多台处理器上并发执行,也可在一台处理器上交互执行。多个线程可以通过读写共享数据区或者发消息的方式互相通信,从而相互配合完成任务。多线程的执行方式可以大大缩短程序执行的时间,提高计算机的运行效率。
[0003]然而,多线程程序中最突出的问题就是数据同步问题。多线程在访问内存变量是需要进行同步以保证逻辑的正确性。在多线程中竞争同一资源是对资源访问顺序性敏感称为竞态条件,导致竞态条件发生的代码区域称为临界区。常见的处理方法为在临界区加互斥锁、信号量等。互斥锁基本由两个原语操作组成:加锁和解锁。任何时候只有一个线程成功加锁并执行之后的程序直至该线程解锁。其余线程会不断尝试访问直至该线程被解锁。在此期间,其余线程都会被操作系统挂起并等待唤醒。
[0004]然而,多线程的初衷是为了让任务更快的并行执行,锁机制虽然可以解决多线程场景下的数据同步问题,但却会使并行转为串行,降低的任务的执行效率。在意识到锁同步机制带来的问题后,近年来业界开始对无锁数据结构进行研究。
[0005]原子操作(atomic operation)是指在该指令操作完毕之前不会被任何其它指令或时间终端打断的操作。为了保证多处理器环境中的原子性,CPU提供一系列新的指令原语,包括:原子读取(Load)、原子存储(Store)、和原子比较交换(CAS)。这些基本的原子操作时最终实现无锁数据结构的基础。
[0006]现如今,实现无锁队列的方式大致可以分为链表实现方式和数组实现方式。其中,链表实现方式为将需要放入队列的数据对象采用链表节点元素进行封装,对队头和对尾进行原子比较交换(CAS),实现消息队列更新。
[0007]无锁队列的数组实现一般采用循环数组。利用循环数组作为队列的存储空间,通过CAS操作确定位置,通过一套屏障算法,避免循环实用队列存储空间时造成同一存储位置的空间堆叠。
[0008]然而,上述无锁队列的实现方式仍旧存在一些影响性能的问题。例如,创建/回收链表节点增加了大量的内存操作,在部分语言中对垃圾收集并不友好;在生产者和消费者之间频繁交换队首和/或对尾计数信息对性能产生影响,以及,部分尾提升性能做出的调整不支持非阻塞操作。

技术实现思路

[0009]本申请实施例所要解决的技术问题在于,提供一种队列数据控制方法及装置,在
循环数组队列的基础上,采用预锁定资源,出错回退的方式,在同时支持阻塞和非阻塞操作的前提下,解耦了生产者和消费者之间,队首及队尾计数信息的频繁传递,提升了队列系统的性能。
[0010]本申请提供一种队列数据控制方法,包括:建立有若干循环队列,每一个循环队列包括有指向所述循环队列的操作地址的队头指针以及队尾指针;设置插入失败计数器,所述插入失败计数器为长度与所述循环队列的长度相同的数组,所述插入失败计数器用于记录所述循环队列的任意地址中插入元素失败事件;设置取出失败计数器,所述取出失败计数器为长度与所述循环队列的长度相同的数组,所述取出失败计数器用于记录所述循环队列的任意地址中取出元素失败事件;设置基于互斥锁原理的插入失败计数器操作锁和取出失败计数器操作锁;当对所述循环队列进行入队操作时,生产者线程发起第一数据存储请求,获取队尾指针,检查所述队尾指针指向的地址在所述取出失败计数器中是否有所述取出元素失败事件的记录,若存在记录,则锁定所述取出失败计数器操作锁,删除所述取出元素失败事件的记录后释放所述取出失败计数器操作锁,并重新获取队尾指针;当对所述循环队列进行出队操作时,消费者线程发起第一数据取出请求,获取队头指针,检查所述队头指针指向的地址在所述插入失败计数器中是否有所述插入元素失败事件的记录,若存在记录,则锁定所述插入失败计数器操作锁,删除所述插入元素失败事件的记录后释放所述插入失败计数器操作锁,并重新获取队头指针。
[0011]进一步的,通过所述插入失败计数器记录所述循环队列的任意地址中插入元素失败事件,所述循环队列的地址与所述插入失败计数器的地址存在映射关系,其中,所述循环队列包括第一地址,所述第一地址与插入失败计数器中的第一映射地址存在映射关系,所述第一映射地址中的元素设置有初始值,当所述第一地址插入元素失败时,所述第一映射地址中元素的值被改写;通过所述取出失败计数器记录所述循环队列的任意地址中取出元素失败事件,所述循环队列的地址与所述取出失败计数器的地址存在映射关系,所述第一地址与所述取出失败计数器中的第二映射地址存在映射关系,所述第二映射地址中的元素设置有初始值,当所述第一地址取出元素失败时,所述第二映射地址中元素的值被改写。
[0012]进一步的,当对所述循环队列进行入队操作时,所述方法包括如下步骤:获取队尾指针,所述队尾指针指向所述循环队列中的第一地址;检查所述第二映射地址中元素的值,当所述第二映射地址中元素的值等于所述初始值时,检查所述循环队列的第一地址中的元素是否为空;响应于所述循环队列的第一地址中的元素为空,通过CAS操作增加所述队尾指针的值,并通过CAS操作将所述第一数据存储请求中的元素插入至所述循环队列的第一地址;其中,当通过CAS操作增加所述队尾指针的值失败时,重新获取所述队尾指针;响应于所述循环队列的第一地址中的元素为非空,检查入队操作是否阻塞,当所述入队操作阻塞时,重新获取所述队尾指针;当所述入队操作非阻塞时,重新检查所述循环队列的第一地址中的元素是否为空,响应于所述循环队列的第一地址中的元素为空,通过CAS操作增加所述队尾指针的值,
并通过CAS操作将所述第一数据存储请求中的元素插入至所述循环队列的第一地址。
[0013]进一步的,所述方法还包括步骤:检查所述第二映射地址中元素的值,当所述第二映射地址中元素的值不等于初始值时,锁定所述取出失败计数器操作锁并再次确认所述第二映射地址中元素的值,当确认所述第二映射地址中元素的值不等于初始值时,通过CAS操作增加所述队尾指针的值;当CAS操作增加所述队尾指针的值成功时,将所述第二映射地址中元素的值改写为初始值,并释放所述取出失败计数器操作锁,重新获取队尾指针;当CAS操作增加所述队尾指针的值失败时,释放所述取出失败计数器操作锁并重新获取所述队尾指针。
[0014]进一步的,所述方法还包括步骤:通过CAS操作将第一数据存储请求中的元素插入至循环队列的第一地址,当插入失败时,锁定所述插入失败计数器操作锁,改写所述第一映射地址中元素的初始值并释放所述插入失败计数器操作锁,重新获取队尾指针;其中,通过将所述第一映射地址中元素的值加一来实现改写所述第一映射地址中元素的初始值。
[0015]进一步的,在所述消费者线程发起第一数据取出请求时,所述方法包括如下步骤:获取队头指针,所述队头指针指向所述循环队列中的第一地本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种队列数据控制方法,其特征在于:建立有若干循环队列,每一个循环队列包括有指向所述循环队列的操作地址的队头指针以及队尾指针;设置插入失败计数器,所述插入失败计数器为长度与所述循环队列的长度相同的数组,所述插入失败计数器用于记录所述循环队列的任意地址中插入元素失败事件;设置取出失败计数器,所述取出失败计数器为长度与所述循环队列的长度相同的数组,所述取出失败计数器用于记录所述循环队列的任意地址中取出元素失败事件;设置基于互斥锁原理的插入失败计数器操作锁和取出失败计数器操作锁;当对所述循环队列进行入队操作时,生产者线程发起第一数据存储请求,获取队尾指针,检查所述队尾指针指向的地址在所述取出失败计数器中是否有所述取出元素失败事件的记录,若存在记录,则锁定所述取出失败计数器操作锁,删除所述取出元素失败事件的记录后释放所述取出失败计数器操作锁,并重新获取队尾指针;当对所述循环队列进行出队操作时,消费者线程发起第一数据取出请求,获取队头指针,检查所述队头指针指向的地址在所述插入失败计数器中是否有所述插入元素失败事件的记录,若存在记录,则锁定所述插入失败计数器操作锁,删除所述插入元素失败事件的记录后释放所述插入失败计数器操作锁,并重新获取队头指针。2.根据权利要求1所述的队列数据控制方法,其特征在于:通过所述插入失败计数器记录所述循环队列的任意地址中插入元素失败事件,所述循环队列的地址与所述插入失败计数器的地址存在映射关系,其中,所述循环队列包括第一地址,所述第一地址与插入失败计数器中的第一映射地址存在映射关系,所述第一映射地址中的元素设置有初始值,当所述第一地址插入元素失败时,所述第一映射地址中元素的值被改写;通过所述取出失败计数器记录所述循环队列的任意地址中取出元素失败事件,所述循环队列的地址与所述取出失败计数器的地址存在映射关系,所述第一地址与所述取出失败计数器中的第二映射地址存在映射关系,所述第二映射地址中的元素设置有初始值,当所述第一地址取出元素失败时,所述第二映射地址中元素的值被改写。3.根据权利要求2所述的队列数据控制方法,其特征在于,当对所述循环队列进行入队操作时,所述方法包括如下步骤:获取队尾指针,所述队尾指针指向所述循环队列中的第一地址;检查所述第二映射地址中元素的值,当所述第二映射地址中元素的值等于所述初始值时,检查所述循环队列的第一地址中的元素是否为空;响应于所述循环队列的第一地址中的元素为空,通过CAS操作增加所述队尾指针的值,并通过CAS操作将所述第一数据存储请求中的元素插入至所述循环队列的第一地址;其中,当通过CAS操作增加所述队尾指针的值失败时,重新获取所述队尾指针;响应于所述循环队列的第一地址中的元素为非空,检查入队操作是否阻塞,当所述入队操作阻塞时,重新获取所述队尾指针;当所述入队操作非阻塞时,重新检查所述循环队列的第一地址中的元素是否为空,响应于所述循环队列的第一地址中的元素为空,通过CAS操作增加所述队尾指针的值,并通过CAS操作将所述第一数据存储请求中的元素插入至所述循环队列的第一地址。4.根据权利要求3所述的队列数据控制方法,其特征在于,所述方法还包括步骤:
检查所述第二映射地址中元素的值,当所述第二映射地址中元素的值不等于初始值时,锁定所述取出失败计数器操作锁并再次确认所述第二映射地址中元素的...

【专利技术属性】
技术研发人员:张宙阮涛左海波梁猛郦建新张扬
申请(专利权)人:浙江齐安信息科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1