CN103793267B - 队列的访问方法及装置 - Google Patents
队列的访问方法及装置 Download PDFInfo
- Publication number
- CN103793267B CN103793267B CN201410033780.XA CN201410033780A CN103793267B CN 103793267 B CN103793267 B CN 103793267B CN 201410033780 A CN201410033780 A CN 201410033780A CN 103793267 B CN103793267 B CN 103793267B
- Authority
- CN
- China
- Prior art keywords
- value
- pointer variable
- node
- dummy node
- queue
- 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.)
- Active
Links
Abstract
本发明公开了一种队列的访问方法及装置,属于数据访问技术领域。包括:创建待加入队列的第二节点;获取队尾指针变量的值,判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;若获取到的值所指向的第一节点中包含的指针变量的值为非空,则确定队尾指针变量的值被更新,获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。本发明当队尾指针变量的值因并行访问而发生更新后,仍然能够继续执行节点的入队列操作,从而在不对队列加锁的情况下实现队列的并行访问,进而提高了访问队列的效率。
Description
技术领域
本发明涉及数据访问技术领域,特别涉及一种队列的访问方法及装置。
背景技术
在进行数据访问技术的过程中,队列作为一种数据结构,由于其FIFO(FirstInput First Output,先进先出)的特性,被应用于许多场合中,如算法的设计等。其中,在对队列进行访问时,为了提高资源利用率及程序运行的速度,多数情况下程序在逻辑意义上被分割为数个线程,采用多线程并发机制,通过多线程对队列进行访问。
相关技术中提供了一种队列的访问方法,在该方法中,当线程A需要访问队列时,会先对该队列加锁,线程A直到访问队列结束后,才会将锁进行解除。按照上述访问方式,线程A在访问队列的过程中,若又到来了一个新的线程B需要对队列进行访问,由于锁并未解除,此时线程B不能对队列进行访问,也就不能对队列中相关变量进行修改。
在实现本发明的过程中,发明人发现相关技术至少存在以下问题:
在使用加锁的方法实现多个线程对队列进行访问时,一个线程访问队列,对该队列加锁,若另一个线程需要对队列进行访问,由于该队列已经加锁,此时该线程会由运行状态变为等待状态,并进行上下文切换。而进行上下文切换的过程需要占用的资源较多,且耗费时间较长。另外,占用队列的线程若未及时解锁,可能会造成其它需要访问该队列的线程等待较长时间,因此,通过加锁的方法实现队列的访问时,效率不高。
发明内容
为了解决现有技术的问题,本发明实施例提供了一种队列的访问方法及装置。所述技术方案如下:
一方面,提供了一种队列的访问方法,所述方法包括:
创建待加入所述队列的第二节点,所述第二节点包括值为空的指针变量;
获取所述队尾指针变量的值,并判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
若获取到的值所指向的第一节点中包含的指针变量的值为非空,则确定所述队尾指针变量的值被更新,获取所述队尾指针变量更新后的值,直至判断所述队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将所述第二节点加入所述队列,并将获取到的值所指向的第一节点包含的指针变量的值指向所述第二节点;
获取所述队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若所述伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取所述队头指针变量的值,并判断两次获取到的所述队头指针变量的值是否相同;若两次获取到的所述队头指针变量的值不同,则确定所述伪节点被更新,重新在两个不同的时间点上分别获取所述队头指针变量的值,直至判断两次获取到的所述队头指针变量的值相同,释放被更新的伪节点,并将所述被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,所述新的伪节点不属于所述队列;或者,
若所述伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值,并判断两次获取到的所述伪节点中包含的指针变量的值是否相同;若两次获取到的所述伪节点中包含的指针变量的值不同,则确定所述伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值,直至判断两次获取到的所述伪节点中包含的指针变量的值相同,删除所述伪节点中包含的指针变量的值所指向的节点。
另一方面,提供了一种队列的访问装置,所述装置包括:
创建模块,用于创建待加入所述队列的第二节点,所述第二节点包括值为空的指针变量;
第一获取模块,用于获取所述队尾指针变量的值;
第一判断模块,用于判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
加入模块,用于当获取到的值所指向的第一节点中包含的指针变量的值为非空时,则确定所述队尾指针变量的值被更新,获取所述队尾指针变量更新后的值,直至判断所述队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将所述第二节点加入所述队列,并将获取到的值所指向的第一节点包含的指针变量的值指向所述第二节点;
所述装置还包括:
第二获取模块,用于获取所述队头指针变量的值;
第二判断模块,用于判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
第三获取模块,用于当所述伪节点中包含的指针变量的值为非空时,则在两个不同的时间点上分别获取所述队头指针变量的值;第三判断模块,用于判断两次获取到的所述队头指针变量的值是否相同;第一删除模块,用于当两次获取到的所述队头指针变量的值不同时,则确定所述伪节点被更新,重新在两个不同的时间点上分别获取所述队头指针变量的值,直至判断两次获取到的所述队头指针变量的值相同,释放被更新的伪节点,并将所述被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,所述新的伪节点不属于所述队列;或者,
所述装置还包括:
第四获取模块,用于获取所述队头指针变量的值;
第四判断模块,用于判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
第五获取模块,用于当获取到的值所指向的伪节点中包含的指针变量的值为非空时,则在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值;
第五判断模块,用于判断两次获取到的所述伪节点中包含的指针变量的值是否相同;
第二删除模块,用于当两次获取到的所述伪节点中包含的指针变量的值不同时,则确定所述伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值,直至判断两次获取到的所述伪节点中包含的指针变量的值相同,删除所述伪节点中包含的指针变量的值所指向的节点。
本发明实施例提供的技术方案的有益效果是:
通过创建待加入队列的第二节点,获取队尾指针变量的值,并判断获取到的值所指向的第一节点中包含的指针变量的值为非空,则确定队尾指针变量的值被更新后,重新获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。实现了当队尾指针变量的值因并行访问而发生更新后,仍然能够继续执行节点的入队列操作,从而在无需对队列进行加锁的情况下可对队列并行访问,进而提高了访问队列的效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一提供的一种队列的访问方法流程图;
图2是本发明实施例二提供的一种队列的访问方法流程图;
图3是本发明实施例二提供的一种队列的访问方法示意图;
图4是本发明实施例三提供的一种队列的访问方法流程图;
图5是本发明实施例三提供的一种队列的访问方法示意图;
图6是本发明实施例四提供的一种队列的访问方法流程图;
图7是本发明实施例四提供的一种队列的访问方法示意图;
图8是本发明实施例三提供的一种队列的访问装置的结构示意图;
图9是本发明实施例四提供的一种终端的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例一
由于在进行队列访问时,若使用加锁的方法实现多个线程对队列进行访问,一个线程访问队列,对该队列加锁,若另一个线程需要对队列进行访问,由于该队列已经加锁,此时该线程会由运行状态变为等待状态,并进行上下文切换。而进行上下文切换的过程需要占用的资源较多,且耗费时间较长。另外,占用队列的线程若未及时解锁,可能会造成其它需要访问该队列的线程等待较长时间,因此,通过加锁的方法实现队列访问时的效率不高。
为了提高队列访问效率,本发明实施例提供了一种队列的访问方法,该方法可以应用于终端,该终端包括但不限于手机、计算机、平板电脑等等,本实施例不对终端的具体形式进行限定。参见图1,本实施例提供的方法流程包括:
101:创建待加入队列的第二节点,第二节点包括值为空的指针变量;
102:获取队尾指针变量的值;
103:判断获取到的值所指向的第一节点中包含的指针变量的值是否为空,若获取到的值所指向的第一节点中包含的指针变量的值为非空,则重新执行步骤102,若获取到的值所指向的第一节点中包含的指针变量的值为空,则执行步骤104;
104:将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。
其中,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点之后,还包括:
将队尾指针变量的值更新为指向第二节点的值。
其中,队列之外还包括一个伪节点,伪节点中包括指针变量,队列还包括队头指针变量,队头指针变量的值用于指向伪节点,该方法还包括:
获取队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取队头指针变量的值,并判断两次获取到的队头指针变量的值是否相同;
若两次获取到的队头指针变量的值不同,则确定伪节点被更新,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点。
其中,将伪节点中包含的指针变量的值所指向的节点更新为新的伪节点之后,还包括:
将队头指针变量的值更新为指向新的伪节点的值。
其中,队列之外还包括一个伪节点,队列还包括队头指针变量,队头指针变量的值用于指向伪节点,该方法还包括:
获取队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若获取到的值所指向的伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取伪节点中包含的指针变量的值,并判断两次获取到的伪节点中包含的指针变量的值是否相同;
若两次获取到的伪节点中包含的指针变量的值不同,则确定伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取伪节点中包含的指针变量的值,直至判断两次获取到的伪节点中包含的指针变量的值相同,删除伪节点中包含的指针变量的值所指向的节点。
其中,删除伪节点中包含的指针变量的值所指向的节点之后,还包括:
将伪节点中包含的指针变量的值指向被删除的节点的下一个节点。
其中,判断获取到的伪节点中包含的指针变量的值是否为空之后,还包括:
若队头指针变量的值所指向的伪节点中包含的指针变量的值为空,则返回删除节点失败的提示。
本实施例提供的方法,通过创建待加入队列的第二节点,并判断获取到的值所指向的第一节点中包含的指针变量的值为非空,确定队尾指针变量的值被更新后,重新获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。实现了当队尾指针变量的值因队列被并行访问而发生更新后,仍然能够继续执行节点的入队操作。另外,通过获取队头指针变量的值,并在判断获取到的值所指向的伪节点中包含的指针变量的值为非空,判断两次获取到的队头指针变量的值不同,确定伪节点被更新时,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,或者删除伪节点中包含的指针变量的值所指向的节点,实现了当伪节点或伪节点的下一个节点因队列被并行访问而发生更新后,仍然能够继续执行节点的出队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
实施例二
本发明实施例提供了一种队列的访问方法,结合上述实施例一的内容,本实施例以队列的访问为入队列操作为例,对本实施例提供的方法进行举例说明。参见图2,本实施例提供的方法流程包括:
201:创建待加入队列的第二节点,第二节点包括值为空的指针变量;
队列中至少包含一个第一节点、队尾指针变量,队尾指针变量的值用于指向队列的尾节点,尾节点为第一节点,队列包含的每个第一节点中至少包含一个指针变量,指针变量的值用于指向当前所在节点所连接的下一个节点,尾节点包含的指针变量的值为空。
本实施例不对队列的构建方式作具体限定,包括但不限于:队列在共享内存上进行构建,共享内存空间预先根据队列中的节点大小划分成相同大小的块作为内存块,每一个内存块用于保存队列中的一个节点。另外,为了对内存块进行管理,每个内存块前面可设置有一块区域存储一个标识位,用于标识该内存块是空闲的,还是已经被使用。由于队列是在共享内存上进行构建,对应的,对队列进行访问其实是基于共享内存的,即并行对队列进行访问是并行对共享内存进行访问。另外,并行对队列进行访问的执行主体可以为多个线程或者多个进程,因此,并行对队列进行访问可以是跨进程或跨线程的队列访问,从而能够提高对队列访问的效率。
其中,队列可以通过链表结构来进行管理,即下一个节点的位置由上一个节点存储,每个节点除了包含自身的信息外,还有一个节点头用于指向下一个节点,节点头后才是节点的内容。为了存储节点头的信息,在共享内存的头部中划出一个保留区,保留区后的空间才被划分等大的内存块。保留区中共存有三项信息:队列是否已经初始化标识位init,头节点的位置即队头指针变量的值head,尾节点的位置即队尾指针变量的值tail。每个第一节点的指针变量可以存储在每个节点的节点头中,本实施例对此不作具体限定。
创建一个待加入队列的第二节点,第二节点包含节点内容和一个指针变量,当然,创建的第二节点中还可以包含其它内容,本实施例对此不作具体限定。需要说明的是,为了后续方便地进行队列访问,创建一个待加入队列的第二节点后,可以对第二节点中的指针变量做初始化的操作。由于该第二节点将作为新节点加入队列中,则可以将该第二节点中的指针变量的值设置为空,本实施例对此不做具体限定。
202:获取队尾指针变量的值;
队尾指针变量的值可以通过读取保留区中tail的值,从而可获取队尾指针变量的值。当然,获取队尾指针变量的值还可以采用其它方法,本实施例对此不作具体限定。
203:判断获取到的值所指向的第一节点中包含的指针变量的值是否为空,若获取到的值所指向的第一节点中包含的指针变量的值为非空,则重新执行步骤202,若获取到的值所指向的第一节点中包含的指针变量的值为空,则执行步骤204;
由于队尾指针变量的值指向的是队列中最后一个节点,当单线程对队列进行访问时,每次入队完毕后,队尾指针变量的值所指向的队列中最后一个节点中包含的指针变量的值始终为空。当多个线程并行对队列进行访问时,若有一个线程改变了队尾指针变量的值所指向的队列中最后一个节点中包含的指针变量的值,其它线程再读取时,就会导致读取出的队尾指针变量的值所指向的队列中最后一个节点中包含的指针变量的值不为空,即获取到的值所指向的第一节点中包含的指针变量的值为非空。此时可确定队尾指针变量的值被更新,重新返回步骤202获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,再执行步骤204。
204:将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点;
将第二节点加入队列后,本实施例不对将获取到的值所指向的第一节点中包含的指针变量的值指向第二节点的方式作具体限定,包括但不限于:获取第二节点在内存中的存储地址,将该存储地址赋值给队尾指针变量所指向的第一节点中包含的指针变量,从而使队尾指针变量所指向的第一节点中包含的指针变量的值指向第二节点。
需要说明的是,为了方便后续进行队列的访问操作,在队列之外设置一个伪节点用于辅助管理队列,即将该伪节点看作队列之外的节点。当队列初始化后,队列为空时,队头指针变量和队尾指针变量的值都指向这个伪节点,伪节点中的节点头和节点内容都为空。
例如,以队列为空,该队列之外包含一个用于辅助管理队列的伪节点为例,将该伪节点记为dummy节点,待加入队列的新节点即为第二节点。如图3所示中的步骤A,将队尾指针变量的值所指向的dummy节点中包含的指针变量的值指向新节点,即指向第二节点。
由于队列中新加入了第二节点,因而队列的尾节点为该新加入的第二节点,在实现第二节点的入队操作之后,本实施例提供的方法还包括后续更新队尾指针变量的值的步骤。
205:将队尾指针变量的值更新为指向第二节点的值。
本实施例不对将队尾指针变量的值更新为指向第二节点的值的更新方式作具体限定,包括但不限于:获取第二节点在内存中的存储地址,将该存储地址赋值给队尾指针变量,从而使队尾指针变量的值指向第二节点。
例如,如图3所示中的步骤B,将队尾指针变量Tail的值指向待加入队列的新节点,其中待加入队列的新节点即为第二节点。
本实施例提供的方法,通过创建待加入队列的第二节点,并判断获取到的值所指向的第一节点中包含的指针变量的值为非空,确定队尾指针变量的值被更新后,重新获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。实现了当队尾指针变量的值因队列被并行访问而发生更新后,仍然能够继续执行节点的入队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
实施例三
本发明实施例提供了一种队列的访问方法,结合上述实施例一的内容,对本实施例提供的方法进行举例说明。参见图4,本实施例提供的方法流程包括:
401:获取队头指针变量的值;
队列中至少包含一个第一节点、队尾指针变量,队尾指针变量的值用于指向队列的尾节点,尾节点为第一节点,队列包含的每个第一节点中至少包含一个指针变量,指针变量的值用于指向当前所在节点所连接的下一个节点,尾节点包含的指针变量的值为空。此外,队列之外还包括一个伪节点,伪节点中包括指针变量,队列还包括队头指针变量,队头指针变量的值用于指向伪节点。队头指针变量的值可以通过读取保留区中head的值,从而可获取队头指针变量的值。当然,获取队头指针变量的值还可以采用其它方法,本实施例对此不作具体限定。
402:判断获取到的值所指向的伪节点中包含的指针变量的值是否为空,若伪节点中包含的指针变量的值为非空,则执行步骤403,若队头指针变量的值所指向的伪节点中包含的指针变量的值为空,则执行步骤407;
由于队列之外设置有一个伪节点,即dummy节点,该伪节点仅用于方便对队列进行操作,伪节点之后的节点才是队列中真正的节点。因此,当伪节点后面没有后续节点时,此时,做出队操作即删除队列中的节点是没有意义的,从而需要判断获取到的值所指向的伪节点中包含的指针变量的值是否为空。本实施例不对判断获取到的值所指向的伪节点中包含的指针变量的值是否为空的判断方式作具体限定,包括但不限于:根据获取到的队头指针变量的值确定队头指针变量所指向的伪节点。若伪节点中包含的指针变量的值为非空,则意味着队列中包含有节点,则执行步骤403,若队头指针变量的值所指向的伪节点中包含的指针变量的值为空,则意味着队列为空,执行步骤407。
403:在两个不同的时间点上分别获取队头指针变量的值;
本实施例不对在两个不同的时间点上分别获取队头指针变量的值的获取方式作具体限定,即关于获取队头指针变量的值的两个不同的时间点,本实施例不作具体限定。包括但不限于:当需要进行出队操作时,读取保留区head的值,从而获取队头指针变量的值。当每隔预设时间段后准备执行步骤404中的判断操作时,再读取保留区head的值,从而再次获取队头指针变量的值。本实施例不对预设时间段的大小进行限定。
404:判断两次获取到的队头指针变量的值是否相同,若两次获取到的队头指针变量的值不同,则重新执行步骤403,若两次获取到的队头指针变量的值相同,则执行步骤405;
由于队头指针变量的值指向的是队列中的伪节点,当单线程对队列进行访问时,每次出队完毕后,队头指针变量的值所指向的伪节点为真正的伪节点。当多个线程并行对队列进行访问时,若有一个线程改变了队头指针变量的值,其它线程再读取时,就会导致读取出的队头指针变量的值所指向的节点并不是真正的伪节点,即两次获取到的队头指针变量的值不相同。此时可确定队头指针变量的值被更新,获取队头指针变量更新后的值,直至判断两次获取到的队头指针变量的值相同,再执行步骤405。
405:释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点;
本实施例不对释放被更新的伪节点的释放方式作具体限定,包括但不限于:将存储被更新的伪节点在内存中的存储空间收回,从而释放被更新的伪节点。
例如,如图5所示,释放图5中的伪节点dummy节点为被更新的伪节点,将dummy节点中包含的指针变量的值所指向的节点1作为新的伪节点。
由于队列中的节点被作为新的伪节点,而新的伪节点不属于队列,因而实现了节点的出队操作。在实现节点的出队操作之后,由于原来的伪节点更新为新的伪节点,因而本实施例提供的方法还包括后续更新队头指针变量的值的步骤。
406:将队头指针变量的值更新为指向新的伪节点的值,此次访问队列结束;
本实施例不对将队头指针变量的值更新为指向新的伪节点的值的更新方式作具体限定,包括但不限于:获取新的伪节点在内存中的存储地址,将该存储地址赋值队头指针变量,从而使队头指针变量的值更新为指向新的伪节点的值,即队头指针变量的值指向新的伪节点。
407:返回删除节点失败的提示。
由于队头指针变量的值所指向的伪节点中包含的指针变量的值为空,即意味着伪节点之后没有节点,即队列为空,出队操作无需进行,因而可返回删除节点失败的提示。本实施例不对返回删除节点失败的提示的返回方式作具体限定,包括但不限于:向系统返回错误标识,系统根据错误标识进行报错。
本实施例提供的方法,通过获取队头指针变量的值,并在判断获取到的值所指向的伪节点中包含的指针变量的值为非空,判断两次获取到的队头指针变量的值不同,确定伪节点被更新时,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,实现了当伪节点因队列被并行访问而发生更新后,仍然能够继续执行节点的出队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
实施例四
本发明实施例提供了一种队列的访问方法,该方法与上述实施例三均以出队操作为例,对队列的访问方法进行举例说明。本实施例与上述实施例三的不同之处在于,上述实施例三是通过将出队列的节点更新为新的伪节点,并释放原来的伪节点的方式实现出队操作。而本实施例中,将伪节点固定不变,通过删除队列中的节点实现出队操作,具体内容将结合上述实施例一的内容,对本实施例提供的方法进行举例说明。参见图6,本实施例提供的方法流程包括:
601:获取队头指针变量的值;
本实施例不对获取队头指针变量的值的获取方式作具体限定,具体实施时可参考实施例三中的步骤401的内容,此处不再赘述。
602:判断获取到的值所指向的伪节点中包含的指针变量的值是否为空,若伪节点中包含的指针变量的值为非空,则执行步骤603,若队头指针变量的值所指向的伪节点中包含的指针变量的值为空,则执行步骤607;
本实施例不对获取队头指针变量的值的获取方式作具体限定,也不对判断获取到的值所指向的伪节点中包含的指针变量的值是否为空的判断方式作具体限定,具体实施时可以参考实施例三中的步骤402,此处不再赘述。
603:在两个不同的时间点上分别获取伪节点中包含的指针变量的值;
本实施例在两个不同的时间点上分别获取伪节点中包含的指针变量的值的获取方式作具体限定,包括但不限于:当需要进行出队操作时,读取保留区head的值,从而获取队头指针变量的值,再获取队头指针变量的值中包含的指针变量的值,即伪节点中包含的指针变量的值。当准备执行步骤604中的判断操作时,再次读取保留区head的值,从而再次获取队头指针变量的值中包含的指针变量的值。
604:判断两次获取到的伪节点中包含的指针变量的值是否相同,若两次获取到的伪节点中包含的指针变量的值不同,则重新执行步骤603,若两次获取到的伪节点中包含的指针变量的值相同,则执行步骤605;
由于伪节点中包含的指针变量的值指向的是队列中头节点,当串行对队列进行访问时,每次出队完毕后,伪节点中包含的指针变量的值指向的是队列中真正的头节点。当并行对队列进行访问时,若其中一次访问改变了伪节点中包含的指针变量的值,再次访问并读取伪节点中包含的指针变量的值,就会导致读取出的伪节点中包含的指针变量的值所指向的节点并不是之前的头节点,即两次获取到的伪节点中包含的指针变量的值不相同,此时确定伪节点中包含的指针变量的值被更新,获取伪节点中包含的指针变量更新后的值,直至判断两次获取到的伪节点中包含的指针变量的值相同,再执行步骤605。
605:删除伪节点中包含的指针变量的值所指向的节点;
本实施例不对删除伪节点中包含的指针变量的值所指向的节点的删除方式作具体限定,包括但不限于:将伪节点中包含的指针变量的值所指向的节点释放,从而删除伪节点中包含的指针变量的值所指向的节点。
例如,如图7所示,将伪节点中包含的指针变量的值所指向的节点1释放,从而删除伪节点中包含的指针变量的值所指向的节点1。
606:将伪节点中包含的指针变量的值指向被删除的节点的下一个节点,此次访问队列结束;
本实施例不对将伪节点中包含的指针变量的值指向被删除的节点的下一个节点的方式作具体限定,包括但不限于:获取伪节点中包含的指针变量的值指向被删除的节点的下一个节点在内存中的存储地址,将该存储地址赋值给伪节点中包含的指针变量,从而使伪节点中包含的指针变量的值指向被删除的节点的下一个节点。
例如,如图7所示,伪节点dummy节点中包含的指针变量的值指向被删除的节点的下一个节点,即节点2。
607:返回删除节点失败的提示。
本实施例不对返回删除节点失败的提示的返回方式作具体限定,具体实施时可参考实施例三中的步骤407,此处不再赘述。
本实施例提供的方法,通过获取队头指针变量的值,并在判断获取到的值所指向的伪节点中包含的指针变量的值为非空,判断两次获取到的伪节点中包含的指针变量的值不同,确定伪节点的下一个节点被更新时,重新在两个不同的时间点上分别获取伪节点中包含的指针变量的值,直至判断两次获取到的伪节点中包含的指针变量的值相同,删除伪节点中包含的指针变量的值所指向的节点,实现了当伪节点的下一个节点因队列被并行访问而发生更新后,仍然能够继续执行节点的出队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
实施例五
本发明实施例提供了一种队列的访问装置,该装置用于执行上述实施例一至实施例四提供的方法。参见图8,该装置包括:
创建模块801,用于创建待加入队列的第二节点,第二节点包括值为空的指针变量;
第一获取模块802,用于获取队尾指针变量的值;
第一判断模块803,用于判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
加入模块804,用于当获取到的值所指向的第一节点中包含的指针变量的值为非空时,则确定队尾指针变量的值被更新,获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。
作为一种优选实施例,该装置还包括:
第一更新模块,用于将队尾指针变量的值更新为指向第二节点的值。
作为一种优选实施例,该装置还包括:
第二获取模块,用于获取队头指针变量的值;
第二判断模块,用于判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
第三获取模块,用于当伪节点中包含的指针变量的值为非空时,则在两个不同的时间点上分别获取队头指针变量的值;
第三判断模块,用于判断两次获取到的队头指针变量的值是否相同;
第一删除模块,用于当两次获取到的队头指针变量的值不同时,则确定伪节点被更新,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点。
作为一种优选实施例,该装置还包括:
第二更新模块,用于将队头指针变量的值更新为指向新的伪节点的值。
作为一种优选实施例,该装置还包括:
第四获取模块,用于获取队头指针变量的值;
第四判断模块,用于判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
第五获取模块,用于当获取到的值所指向的伪节点中包含的指针变量的值为非空时,则在两个不同的时间点上分别获取伪节点中包含的指针变量的值;
第五判断模块,用于判断两次获取到的伪节点中包含的指针变量的值是否相同;
第二删除模块,用于当两次获取到的伪节点中包含的指针变量的值不同时,则确定伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取伪节点中包含的指针变量的值,直至判断两次获取到的伪节点中包含的指针变量的值相同,删除伪节点中包含的指针变量的值所指向的节点。
作为一种优选实施例,该装置还包括:
第三更新模块,用于将伪节点中包含的指针变量的值指向被删除的节点的下一个节点。
作为一种优选实施例,该装置还包括:
返回模块,用于当队头指针变量的值所指向的伪节点中包含的指针变量的值为空时,则返回删除节点失败的提示。
本实施例提供的装置,通过创建待加入队列的第二节点,并判断获取到的值所指向的第一节点中包含的指针变量的值为非空,确定队尾指针变量的值被更新后,重新获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。实现了当队尾指针变量的值因队列被并行访问而发生更新后,仍然能够继续执行节点的入队操作。另外,通过获取队头指针变量的值,并在判断获取到的值所指向的伪节点中包含的指针变量的值为非空,判断两次获取到的队头指针变量的值不同,确定伪节点被更新时,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,或者删除伪节点中包含的指针变量的值所指向的节点,实现了当伪节点或伪节点的下一个节点因队列被并行访问而发生更新后,仍然能够继续执行节点的出队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
实施例七
本实施例提供了一种终端,该终端可以用于执行上述实施例中队列的访问方法。参见图9,该终端900包括:
终端900可以包括RF(Radio Frequency,射频)电路110、包括有一个或一个以上计算机可读存储介质的存储器120、输入单元130、显示单元140、传感器150、音频电路160、WiFi(Wireless Fidelity,无线保真)模块170、包括有一个或者一个以上处理核心的处理器180、以及电源190等部件。本领域技术人员可以理解,图9中示出的终端结构并不构成对终端的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
RF电路110可用于收发信息或通话过程中,信号的接收和发送,特别地,将基站的下行信息接收后,交由一个或者一个以上处理器180处理;另外,将涉及上行的数据发送给基站。通常,RF电路110包括但不限于天线、至少一个放大器、调谐器、一个或多个振荡器、用户身份模块(SIM)卡、收发信机、耦合器、LNA(Low Noise Amplifier,低噪声放大器)、双工器等。此外,RF电路110还可以通过无线通信与网络和其他设备通信。所述无线通信可以使用任一通信标准或协议,包括但不限于GSM(Global System of Mobile communication,全球移动通讯系统)、GPRS(General Packet Radio Service,通用分组无线服务)、CDMA(CodeDivision Multiple Access,码分多址)、WCDMA(Wideband Code Division MultipleAccess,宽带码分多址)、LTE(Long Term Evolution,长期演进)、电子邮件、SMS(ShortMessaging Service,短消息服务)等。
存储器120可用于存储软件程序以及模块,处理器180通过运行存储在存储器120的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器120可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据终端900的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器120可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器120还可以包括存储器控制器,以提供处理器180和输入单元130对存储器120的访问。
输入单元130可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,输入单元130可包括触敏表面131以及其他输入设备132。触敏表面131,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面131上或在触敏表面131附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面131可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器180,并能接收处理器180发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面131。除了触敏表面131,输入单元130还可以包括其他输入设备132。具体地,其他输入设备132可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元140可用于显示由用户输入的信息或提供给用户的信息以及终端900的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元140可包括显示面板141,可选的,可以采用LCD(Liquid Crystal Display,液晶显示器)、OLED(Organic Light-Emitting Diode,有机发光二极管)等形式来配置显示面板141。进一步的,触敏表面131可覆盖显示面板141,当触敏表面131检测到在其上或附近的触摸操作后,传送给处理器180以确定触摸事件的类型,随后处理器180根据触摸事件的类型在显示面板141上提供相应的视觉输出。虽然在图9中,触敏表面131与显示面板141是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面131与显示面板141集成而实现输入和输出功能。
终端900还可包括至少一种传感器150,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板141的亮度,接近传感器可在终端900移动到耳边时,关闭显示面板141和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于终端900还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路160、扬声器161,传声器162可提供用户与终端900之间的音频接口。音频电路160可将接收到的音频数据转换后的电信号,传输到扬声器161,由扬声器161转换为声音信号输出;另一方面,传声器162将收集的声音信号转换为电信号,由音频电路160接收后转换为音频数据,再将音频数据输出处理器180处理后,经RF电路110以发送给比如另一终端,或者将音频数据输出至存储器120以便进一步处理。音频电路160还可能包括耳塞插孔,以提供外设耳机与终端900的通信。
WiFi属于短距离无线传输技术,终端900通过WiFi模块170可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图9示出了WiFi模块170,但是可以理解的是,其并不属于终端900的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器180是终端900的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器120内的软件程序和/或模块,以及调用存储在存储器120内的数据,执行终端900的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器180可包括一个或多个处理核心;优选的,处理器180可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器180中。
终端900还包括给各个部件供电的电源190(比如电池),优选的,电源可以通过电源管理系统与处理器180逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源190还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
尽管未示出,终端900还可以包括摄像头、蓝牙模块等,在此不再赘述。具体在本实施例中,终端的显示单元是触摸屏显示器,终端还包括有存储器,以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上处理器执行。所述一个或者一个以上程序包含用于执行以下操作的指令:
创建待加入队列的第二节点,第二节点包括值为空的指针变量;
获取队尾指针变量的值,并判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
若获取到的值所指向的第一节点中包含的指针变量的值为非空,则确定队尾指针变量的值被更新,获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。
假设上述为第一种可能的实施方式,则在第一种可能的实施方式作为基础而提供的第二种可能的实施方式中,终端的存储器中,还包含用于执行以下操作的指令:
将队尾指针变量的值更新为指向第二节点的值。
在第一种或第二种可能的实施方式的任一种实施方式作为基础而提供的第三种可能的实施方式中,终端的存储器中,还包含用于执行以下操作的指令:
获取队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取队头指针变量的值,并判断两次获取到的队头指针变量的值是否相同;
若两次获取到的队头指针变量的值不同,则确定伪节点被更新,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点。
在第三种可能的实施方式作为基础而提供的第四种可能的实施方式中,终端的存储器中,还包含用于执行以下操作的指令:
将队头指针变量的值更新为指向新的伪节点的值。
在第一种或第二种可能的实施方式的任一种实施方式作为基础而提供的第五种可能的实施方式中,终端的存储器中,还包含用于执行以下操作的指令:
获取队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若获取到的值所指向的伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取伪节点中包含的指针变量的值,并判断两次获取到的伪节点中包含的指针变量的值是否相同;
若两次获取到的伪节点中包含的指针变量的值不同,则确定伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取伪节点中包含的指针变量的值,直至判断两次获取到的伪节点中包含的指针变量的值相同,删除伪节点中包含的指针变量的值所指向的节点。
在第五种可能的实施方式作为基础而提供的第六种可能的实施方式中,终端的存储器中,还包含用于执行以下操作的指令:
将伪节点中包含的指针变量的值指向被删除的节点的下一个节点。
在第三种或第五种可能的实施方式的任一种实施方式作为基础而提供的第七种可能的实施方式中,终端的存储器中,还包含用于执行以下操作的指令:
若队头指针变量的值所指向的伪节点中包含的指针变量的值为空,则返回删除节点失败的提示。
本发明提供的终端,通过创建待加入队列的第二节点,并判断获取到的值所指向的第一节点中包含的指针变量的值为非空,确定队尾指针变量的值被更新后,重新获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。实现了当队尾指针变量的值因队列被并行访问而发生更新后,仍然能够继续执行节点的入队操作。另外,通过获取队头指针变量的值,并在判断获取到的值所指向的伪节点中包含的指针变量的值为非空,判断两次获取到的队头指针变量的值不同,确定伪节点被更新时,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,或者删除伪节点中包含的指针变量的值所指向的节点,实现了当伪节点或伪节点的下一个节点因队列被并行访问而发生更新后,仍然能够继续执行节点的出队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
实施例八
本发明实施例还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中的存储器中所包含的计算机可读存储介质;也可以是单独存在,未装配入终端中的计算机可读存储介质。该计算机可读存储介质存储有一个或者一个以上程序,该一个或者一个以上程序被一个或者一个以上的处理器用来执行实现多维数据的权限查询方法,该方法包括:
创建待加入队列的第二节点,第二节点包括值为空的指针变量;
获取队尾指针变量的值,并判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
若获取到的值所指向的第一节点中包含的指针变量的值为非空,则确定队尾指针变量的值被更新,获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。
假设上述为第一种可能的实施方式,则在第一种可能的实施方式作为基础而提供的第二种可能的实施方式中,所述将所述第二节点加入所述队列,并将获取到的值所指向的第一节点包含的指针变量的值指向所述第二节点之后,还包括:
将队尾指针变量的值更新为指向所述第二节点的值。
在第一种或者第二种可能的实施方式作为基础而提供的第三种可能的实施方式中,所述队列之外还包括一个伪节点,所述伪节点中包括指针变量,所述队列还包括队头指针变量,所述队头指针变量的值用于指向所述伪节点,所述方法还包括:
获取队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取队头指针变量的值,并判断两次获取到的队头指针变量的值是否相同;
若两次获取到的队头指针变量的值不同,则确定伪节点被更新,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点。
在第三种可能的实施方式作为基础而提供的第四种可能的实施方式中,所述将所述伪节点中包含的指针变量的值所指向的节点更新为新的伪节点之后,还包括:
将队头指针变量的值更新为指向所述新的伪节点的值。
在第一种或者第二种可能的实施方式作为基础而提供的第五种可能的实施方式中,所述队列之外还包括一个伪节点,所述队列还包括队头指针变量,所述队头指针变量的值用于指向所述伪节点,所述方法还包括:
获取队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若获取到的值所指向的伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取伪节点中包含的指针变量的值,并判断两次获取到的伪节点中包含的指针变量的值是否相同;
若两次获取到的伪节点中包含的指针变量的值不同,则确定伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取伪节点中包含的指针变量的值,直至判断两次获取到的伪节点中包含的指针变量的值相同,删除伪节点中包含的指针变量的值所指向的节点。
在第五种可能的实施方式作为基础而提供的第六种可能的实施方式中,所述删除所述伪节点中包含的指针变量的值所指向的节点之后,还包括:
将伪节点中包含的指针变量的值指向被删除的节点的下一个节点。
在第三种或者第五种可能的实施方式作为基础而提供的第五种可能的实施方式中,所述判断获取到的伪节点中包含的指针变量的值是否为空之后,还包括:
若队头指针变量的值所指向的伪节点中包含的指针变量的值为空,则返回删除节点失败的提示。
本发明实施例提供的计算机可读存储介质,通过创建待加入队列的第二节点,并判断获取到的值所指向的第一节点中包含的指针变量的值为非空,确定队尾指针变量的值被更新后,重新获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。实现了当队尾指针变量的值因队列被并行访问而发生更新后,仍然能够继续执行节点的入队操作。另外,通过获取队头指针变量的值,并在判断获取到的值所指向的伪节点中包含的指针变量的值为非空,判断两次获取到的队头指针变量的值不同,确定伪节点被更新时,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,或者删除伪节点中包含的指针变量的值所指向的节点,实现了当伪节点或伪节点的下一个节点因队列被并行访问而发生更新后,仍然能够继续执行节点的出队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
实施例九
本发明实施例提供了一种图形用户接口,所述图形用户接口用在终端上,所述终端包括触摸屏显示器、存储器和用于执行一个或者一个以上的程序的一个或者一个以上的处理器;所述图形用户接口包括:
创建待加入队列的第二节点,第二节点包括值为空的指针变量;
获取队尾指针变量的值,并判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
若获取到的值所指向的第一节点中包含的指针变量的值为非空,则确定队尾指针变量的值被更新,获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。
本发明实施例提供的图形用户接口,通过创建待加入队列的第二节点,并判断获取到的值所指向的第一节点中包含的指针变量的值为非空,确定队尾指针变量的值被更新后,重新获取队尾指针变量更新后的值,直至判断队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将第二节点加入队列,并将获取到的值所指向的第一节点包含的指针变量的值指向第二节点。实现了当队尾指针变量的值因队列被并行访问而发生更新后,仍然能够继续执行节点的入队操作。另外,通过获取队头指针变量的值,并在判断获取到的值所指向的伪节点中包含的指针变量的值为非空,判断两次获取到的队头指针变量的值不同,确定伪节点被更新时,重新在两个不同的时间点上分别获取队头指针变量的值,直至判断两次获取到的队头指针变量的值相同,释放被更新的伪节点,并将被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,或者删除伪节点中包含的指针变量的值所指向的节点,实现了当伪节点或伪节点的下一个节点因队列被并行访问而发生更新后,仍然能够继续执行节点的出队操作。从而在无需对队列进行加锁的情况下,可对队列并行访问,进而提高了访问队列的效率。
需要说明的是:上述实施例提供的队列的访问装置在访问队列时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的队列的访问装置与队列的访问方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种队列访问方法,其特征在于,所述队列中至少包含一个第一节点、队尾指针变量和队头指针变量,所述队尾指针变量的值用于指向所述队列的尾节点,所述尾节点为第一节点,所述队头指针变量的值用于指向伪节点,所述伪节点在所述队列之外,所述队列包含的每个第一节点中至少包含一个指针变量,所述指针变量的值用于指向当前所在节点所连接的下一个节点,尾节点包含的指针变量的值为空,所述方法包括:
创建待加入所述队列的第二节点,所述第二节点包括值为空的指针变量;
获取所述队尾指针变量的值,并判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
若获取到的值所指向的第一节点中包含的指针变量的值为非空,则确定所述队尾指针变量的值被更新,获取所述队尾指针变量更新后的值,直至判断所述队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将所述第二节点加入所述队列,并将获取到的值所指向的第一节点包含的指针变量的值指向所述第二节点;
获取所述队头指针变量的值,并判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
若所述伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取所述队头指针变量的值,并判断两次获取到的所述队头指针变量的值是否相同;若两次获取到的所述队头指针变量的值不同,则确定所述伪节点被更新,重新在两个不同的时间点上分别获取所述队头指针变量的值,直至判断两次获取到的所述队头指针变量的值相同,释放被更新的伪节点,并将所述被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,所述新的伪节点不属于所述队列;或者,
若所述伪节点中包含的指针变量的值为非空,则在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值,并判断两次获取到的所述伪节点中包含的指针变量的值是否相同;若两次获取到的所述伪节点中包含的指针变量的值不同,则确定所述伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值,直至判断两次获取到的所述伪节点中包含的指针变量的值相同,删除所述伪节点中包含的指针变量的值所指向的节点。
2.根据权利要求1所述的方法,其特征在于,所述将所述第二节点加入所述队列,并将获取到的值所指向的第一节点包含的指针变量的值指向所述第二节点之后,还包括:
将所述队尾指针变量的值更新为指向所述第二节点的值。
3.根据权利要求1所述的方法,其特征在于,所述将所述伪节点中包含的指针变量的值所指向的节点更新为新的伪节点之后,还包括:
将所述队头指针变量的值更新为指向所述新的伪节点的值。
4.根据权利要求1所述的方法,其特征在于,所述删除所述伪节点中包含的指针变量的值所指向的节点之后,还包括:
将所述伪节点中包含的指针变量的值指向被删除的节点的下一个节点。
5.根据权利要求1所述的方法,其特征在于,所述判断获取到的伪节点中包含的指针变量的值是否为空之后,还包括:
若所述队头指针变量的值所指向的伪节点中包含的指针变量的值为空,则返回删除节点失败的提示。
6.一种队列的访问装置,其特征在于,所述队列中至少包含一个第一节点、队尾指针变量和队头指针变量,所述队尾指针变量的值用于指向所述队列的尾节点,所述尾节点为第一节点,所述队头指针变量的值用于指向伪节点,所述伪节点在所述队列之外,所述队列包含的每个第一节点中至少包含一个指针变量,所述指针变量的值用于指向当前所在节点所连接的下一个节点,尾节点包含的指针变量的值为空,所述装置包括:
创建模块,用于创建待加入所述队列的第二节点,所述第二节点包括值为空的指针变量;
第一获取模块,用于获取所述队尾指针变量的值;
第一判断模块,用于判断获取到的值所指向的第一节点中包含的指针变量的值是否为空;
加入模块,用于当获取到的值所指向的第一节点中包含的指针变量的值为非空时,则确定所述队尾指针变量的值被更新,获取所述队尾指针变量更新后的值,直至判断所述队尾指针变量更新后的值所指向的第一节点中包含的指针变量的值为空,将所述第二节点加入所述队列,并将获取到的值所指向的第一节点包含的指针变量的值指向所述第二节点;
所述装置还包括:
第二获取模块,用于获取所述队头指针变量的值;
第二判断模块,用于判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
第三获取模块,用于当所述伪节点中包含的指针变量的值为非空时,则在两个不同的时间点上分别获取所述队头指针变量的值;第三判断模块,用于判断两次获取到的所述队头指针变量的值是否相同;第一删除模块,用于当两次获取到的所述队头指针变量的值不同时,则确定所述伪节点被更新,重新在两个不同的时间点上分别获取所述队头指针变量的值,直至判断两次获取到的所述队头指针变量的值相同,释放被更新的伪节点,并将所述被更新的伪节点中包含的指针变量的值所指向的节点作为新的伪节点,所述新的伪节点不属于所述队列;或者,
所述装置还包括:
第四获取模块,用于获取所述队头指针变量的值;
第四判断模块,用于判断获取到的值所指向的伪节点中包含的指针变量的值是否为空;
第五获取模块,用于当获取到的值所指向的伪节点中包含的指针变量的值为非空时,则在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值;
第五判断模块,用于判断两次获取到的所述伪节点中包含的指针变量的值是否相同;
第二删除模块,用于当两次获取到的所述伪节点中包含的指针变量的值不同时,则确定所述伪节点的下一个节点被更新,重新在两个不同的时间点上分别获取所述伪节点中包含的指针变量的值,直至判断两次获取到的所述伪节点中包含的指针变量的值相同,删除所述伪节点中包含的指针变量的值所指向的节点。
7.根据权利要求6所述的装置,其特征在于,所述装置还包括:
第一更新模块,用于将所述队尾指针变量的值更新为指向所述第二节点的值。
8.根据权利要求6所述的装置,其特征在于,所述装置还包括:
第二更新模块,用于将所述队头指针变量的值更新为指向所述新的伪节点的值。
9.根据权利要求6所述的装置,其特征在于,所述装置还包括:
第三更新模块,用于将所述伪节点中包含的指针变量的值指向被删除的节点的下一个节点。
10.根据权利要求6所述的装置,其特征在于,所述装置还包括:
返回模块,用于当所述队头指针变量的值所指向的伪节点中包含的指针变量的值为空时,则返回删除节点失败的提示。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410033780.XA CN103793267B (zh) | 2014-01-23 | 2014-01-23 | 队列的访问方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410033780.XA CN103793267B (zh) | 2014-01-23 | 2014-01-23 | 队列的访问方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103793267A CN103793267A (zh) | 2014-05-14 |
CN103793267B true CN103793267B (zh) | 2017-07-21 |
Family
ID=50668979
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410033780.XA Active CN103793267B (zh) | 2014-01-23 | 2014-01-23 | 队列的访问方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103793267B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108664335B (zh) * | 2017-04-01 | 2020-06-30 | 北京忆芯科技有限公司 | 通过代理进行队列通信的方法与装置 |
CN110046049A (zh) * | 2018-01-15 | 2019-07-23 | 迈普通信技术股份有限公司 | 队列管理方法、装置及数据通信设备 |
CN108830724B (zh) * | 2018-04-12 | 2023-04-14 | 平安科技(深圳)有限公司 | 一种资源数据包处理方法及终端设备 |
CN111488496B (zh) * | 2020-04-30 | 2023-07-21 | 湖北师范大学 | 一种基于滑动窗口的Tango树构建方法及系统 |
CN111814007B (zh) * | 2020-07-31 | 2023-03-31 | 新华三信息安全技术有限公司 | 双向链表数据处理方法、装置、设备及机器可读存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6032207A (en) * | 1996-12-23 | 2000-02-29 | Bull Hn Information Systems Inc. | Search mechanism for a queue system |
CN101183304A (zh) * | 2006-11-13 | 2008-05-21 | 国际商业机器公司 | 并发非阻塞无锁队列及其实施方法和装置 |
CN103262036A (zh) * | 2010-12-17 | 2013-08-21 | 英特尔公司 | 非阻塞无等待数据并行调度器 |
-
2014
- 2014-01-23 CN CN201410033780.XA patent/CN103793267B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6032207A (en) * | 1996-12-23 | 2000-02-29 | Bull Hn Information Systems Inc. | Search mechanism for a queue system |
CN101183304A (zh) * | 2006-11-13 | 2008-05-21 | 国际商业机器公司 | 并发非阻塞无锁队列及其实施方法和装置 |
CN103262036A (zh) * | 2010-12-17 | 2013-08-21 | 英特尔公司 | 非阻塞无等待数据并行调度器 |
Also Published As
Publication number | Publication date |
---|---|
CN103793267A (zh) | 2014-05-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103942113B (zh) | 系统重启原因的检测方法、装置及终端设备 | |
CN103389863B (zh) | 一种显示控制方法和装置 | |
CN105278937B (zh) | 一种显示弹出框消息的方法及装置 | |
CN106708554B (zh) | 程序运行方法及装置 | |
CN104142868B (zh) | 建立连接的方法及装置 | |
CN103365419B (zh) | 一种触发闹钟控制指令的方法和装置 | |
CN104519404B (zh) | 图像互换格式文件的播放方法及装置 | |
CN103793267B (zh) | 队列的访问方法及装置 | |
CN103455603A (zh) | 网页内容缓存、网页加载方法、装置及终端设备 | |
CN104363988B (zh) | 一种多核处理器的管理方法及装置 | |
CN106371900A (zh) | 一种实现异步调用的数据处理方法及装置 | |
CN106775267A (zh) | 一种显示游戏插件的功能菜单的方法和装置 | |
CN106775833A (zh) | 设备驱动程序加载方法、终端及系统 | |
CN106951143A (zh) | 隐藏应用图标的方法及装置 | |
CN107145386A (zh) | 数据迁移方法、终端设备及计算机可读存储介质 | |
CN107423050A (zh) | 一种穿透操作的方法和装置 | |
CN104901992A (zh) | 一种资源转移的方法和装置 | |
CN105577712B (zh) | 一种文件上传方法、装置和系统 | |
CN105022621A (zh) | 收藏会话消息的方法、装置及终端 | |
CN104216935B (zh) | 一种文件查找的方法及终端 | |
CN106534998A (zh) | 视频通信界面显示方法、装置及系统 | |
CN105872041B (zh) | 操作对象的处理方法及装置 | |
CN109451295A (zh) | 一种获取虚拟信息的方法和系统 | |
CN103561119B (zh) | 获取介质访问控制地址的方法、装置及设备 | |
CN104683553B (zh) | 垃圾短信的管理方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant |