发明内容
本发明的目的是提供一种多核环境下实现免锁队列的方法和设备,以解决当出现并发访问冲突多核CPU在获取共享队列锁时由于空等待导致系统效率低的问题。
本发明的目的是通过以下技术方案实现的:
一种多核环境下实现免锁队列的方法,包括:
确定一个环形队列,所述环形队列的存储结构采用数组形式存储,所述环形队列包括生产者子队列和消费者子队列;
当生产者有M个数据入队时,获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针,从所述生产者子队列初始头指针开始依次将M个数据加入到所述环形队列中,获取所述生产者子队列的尾指针作为生产者子队列初始尾指针,确定所述生产者子队列初始尾指针等于所述生产者子队列初始头指针时,将所述生产者子队列初始尾指针加M作为新的生产者子队列尾指针,入队完成,其中M为正整数;
当消费者有N个数据出队时,获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针,从所述消费者子队列初始头指针开始依次将N个数据从所述环形队列中清除,获取所述消费者子队列的尾指针作为消费者子队列初始尾指针,确定所述消费者子队列初始尾指针等于所述消费者子队列初始头指针时,将所述消费者子队列初始尾指针加N作为新的消费者子队列尾指针,出队完成,其中N为正整数。
这样,在多核环境下实现免锁队列的过程中在队列的入队和出队操作中,没有使用队列锁的机制独占队列,而是让多个模块同时访问队列的不同部分,从而有效解决了多生产者或多消费者并发访问时的冲突,减少了CPU核空等待的时间,进而提高了多核系统的效率。
可选的,所述生产者子队列与所述消费者子队列均可以占据所述环形队列的任何存储空间,且针对所述生产者子队列和所述消费者子队列的操作方向相同。
可选的,进一步包括:
在系统初始化阶段,将所述生产者子队列的头指针、所述生产者子队列的尾指针、所述消费者子队列的头指针和所述消费者子队列的尾指针均设置为所述环形队列对应的数组结构的第一个元素。
可选的,确定所述环形队列未满,具体包括:
当生产者有M个数据入队时,判断所述消费者子队列第一尾指针是否等于所述生产者子队列初始头指针加1,若是,则判定所述环形队列已满,不能执行生产者的入队操作;否则,判定所述环形队列未满,继续执行生产者的入队操作。
可选的,当生产者有M个数据入队时,在确定所述环形队列未满之后,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针之前,进一步包括:
获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,再次获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,执行后续操作。
可选的,确定所述环形队列未空,具体包括:
当消费者有N个数据出队时,判断当前生产者子队列的尾指针是否等于所述消费者子队列初始头指针,若是,则判定所述环形队列已空,不能执行消费者的出队操作;否则,判定所述环形队列未空,继续执行消费者的出队操作。
可选的,当消费者有N个数据出队时,确定所述环形队列未空之后,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针之前,进一步包括:
获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,再次获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,执行后续操作。
一种多核环境下实现免锁队列的设备,包括:
确定单元,用于确定一个环形队列,所述环形队列的存储结构采用数组形式存储,所述环形队列包括生产者子队列和消费者子队列;
第一处理单元,用于当生产者有M个数据入队时,获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针,从所述生产者子队列初始头指针开始依次将M个数据加入到所述环形队列中,获取所述生产者子队列的尾指针作为生产者子队列初始尾指针,确定所述生产者子队列初始尾指针等于所述生产者子队列初始头指针时,将所述生产者子队列初始尾指针加M作为新的生产者子队列尾指针,入队完成,其中M为正整数;
第二处理单元,用于当消费者有N个数据出队时,获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针,从所述消费者子队列初始头指针开始依次将N个数据从所述环形队列中清除,获取所述消费者子队列的尾指针作为消费者子队列初始尾指针,确定所述消费者子队列初始尾指针等于所述消费者子队列初始头指针时,将所述消费者子队列初始尾指针加N作为新的消费者子队列尾指针,出队完成,其中N为正整数。
这样,在多核环境下实现免锁队列的过程中在队列的入队和出队操作中,没有使用队列锁的机制独占队列,而是让多个模块同时访问队列的不同部分,从而有效解决了多生产者或多消费者并发访问时的冲突,减少了CPU核空等待的时间,进而提高了多核系统的效率。
可选的,所述生产者子队列与所述消费者子队列均可以占据所述环形队列的任何存储空间,且针对所述生产者子队列和所述消费者子队列的操作方向相同。
可选的,所述确定单元进一步用于:
在系统初始化阶段,将所述生产者子队列的头指针、所述生产者子队列的尾指针、所述消费者子队列的头指针和所述消费者子队列的尾指针均设置为所述环形队列对应的数组结构的第一个元素。
可选的,确定所述环形队列未满时,所述第一处理单元具体用于:
当生产者有M个数据入队时,判断所述消费者子队列第一尾指针是否等于所述生产者子队列初始头指针加8,若是,则判定所述环形队列已满,不能执行生产者的入队操作;否则,判定所述环形队列未满,继续执行生产者的入队操作。
可选的,当生产者有M个数据入队时,在确定所述环形队列未满之后,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针之前,所述第一处理单元进一步用于:
获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,再次获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,执行后续操作。
可选的,确定所述环形队列未空时,所述第二处理单元具体用于:
当消费者有N个数据出队时,判断当前生产者子队列的尾指针是否等于所述消费者子队列初始头指针,若是,则判定所述环形队列已空,不能执行消费者的出队操作;否则,判定所述环形队列未空,继续执行消费者的出队操作。
可选的,当消费者有N个数据出队时,确定所述环形队列未空之后,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针之前,所述第二处理单元进一步用于:
获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,再次获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,执行后续操作。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例实现免锁队列的方法中基于三个组成部分:环形数组结构区、生产者子队列、消费者子队列,其中,环形数组结构区(即环形缓冲区)由多个数据单元组成,用于保存共享数据单元的起始地址;生产者子队列包括生产者子队列头指针和尾指针,用于标识生产者正在操作的环形数组的某个区间;消费者子队列包括消费者子队列头指针和尾指针,用于标识消费者正在操作的环形数组的某个区间。当生产者需要往环形缓冲区中存放N个数据单元时,先用生产者子队列头指针加上需要存放数据的单元量N,得到新的生产者子队列头指针,然后生产者从原生产者子队列的头指针开始向环形缓冲区中依次存入数据单元,直到所有要存入的数据单元都入队后,用原始生产者尾指针加上所生产的数据量N得到新的生产者尾指针,完成数据单元入队操作;当有消费者需要取M个单元数据时,先把原消费者子队列头指针加上M得到新的消费者子队列头指针,然后从原消费者子队列头部指针所指的队列单元开始,依次取出数据,直到完成M个数据单元的读取,最后把消费者子队列尾指针加上所消费的数量M得到新的消费者子队列尾指针。
具体的,参阅图1所示,本发明实施例提供一种多核环境下实现免锁队列的方法,具体过程如下所示:
步骤100:确定一个环形队列,该环形队列的存储结构采用数组形式存储,该环形队列包括生产者子队列和消费者子队列。
其中,该生产者子队列与该消费者子队列均可以占据该环形队列的任何存储空间,且针对该生产者子队列和该消费者子队列的操作方向相同。
例如,参阅图2所示,设计一个数组做为环形队列的存储结构,数组的元素用于保存存储信息的起始地址;设计一个生产者子队列对象,生产者子队列对象标识当前环形队列中正在被生产者存入数据的某段子队列(在此暂称其为生产者子队列),通常位于环形队列的头部。该生产者子队列对象由两个域组成,分别是生产者子队列头指针域(producer.head)和生产者子队列尾指针域(producer.tail),生产者子队列头指针域标识生产者子队列头部在环形队列中的位置,而生产者子队列尾指针域标识生产者子队列尾部在环形队列的位置。设计一个消费者子队列对象,消费者子队列对象标识当前环形队列中正在被消费者读取数据的某段子队列(在此暂称其为消费者子队列),通常位于环形队列的尾部。该消费者子队列对象由两个域组成,分别是消费者子队列头指针域(consumer.head)和消费者子队列尾指针域(consumer.tail),消费者子队列头指针域标识消费者子队列头部在环形队列中的位置,而消费者子队列尾指针域标识消费者子队列尾部在环形队列的位置。
具体的,在系统初始化阶段,该生产者子队列的头指针、该生产者子队列的尾指针、该消费者子队列的头指针和该消费者子队列的尾指针均设置为该环形队列对应的数组结构的第一个元素。
由此可以看出,当系统中没有生产者正在向环形队列生产数据时,生产者子队列头指针域和生产者子队列尾指针域是一样的,它们共同指向环形队列的头部;当系统中没有消费者正在从环形队列中取数据时,消费者子队列头指针域和消费者子队列尾指针域也是一样的,它们共同指向环形队列的尾部。
步骤101:当生产者有M个数据入队时,获取生产者子队列的头指针作为生产者子队列初始头指针,获取消费者子队列的尾指针作为消费者子队列第一尾指针,基于该生产者子队列初始头指针和该消费者子队列第一尾指针,确定该环形队列未满时,将该生产者子队列初始头指针加M作为新的生产者子队列头指针,从该生产者子队列初始头指针开始依次将M个数据加入到该环形队列中,获取该生产者子队列的尾指针作为生产者子队列初始尾指针,确定该生产者子队列初始尾指针等于该生产者子队列初始头指针时,将该生产者子队列初始尾指针加M作为新的生产者子队列尾指针,入队完成,其中M为正整数。
需要说明的是,当环形队列未满时,生产者才能向环形队列存数据,当环形队列已满时,生产者不能向环形队列存数据,因此,当生产者有M个数据入队时,判断该消费者子队列第一尾指针是否等于该生产者子队列初始头指针加1,若是,则判定该环形队列已满,不能执行生产者的入队操作;否则,判定该环形队列未满,继续执行生产者的入队操作。
进一步的,当生产者有M个数据入队时,在确定该环形队列未满之后,将该生产者子队列初始头指针加M作为新的生产者子队列头指针之前,还要对生产者子队列头指针进行比较赋值的原子操作,具体过称为:获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于该生产者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取该生产者子队列的头指针作为生产者子队列初始头指针,获取该消费者子队列的尾指针作为消费者子队列第一尾指针,基于该生产者子队列初始头指针和该消费者子队列第一尾指针,确定该环形队列未满时,再次获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于该生产者子队列初始头指针,执行后续操作。
这样做的目的是能够进一步确保对该生产者子队列进行操作之前,第一次记录的生产者子队列头指针没有发生任何变化是准确的,若发生变化说明有其他生产者对生产者子队列的头指针进行了改变,为保证程序的准确性需要再次对生产者子队列头指针进行比较赋值的原子操作,直到对生产者子队列头指针进行比较赋值的原子操作成功时,才会继续后续的入队操作。
步骤102:当消费者有N个数据出队时,获取消费者子队列的头指针作为消费者子队列初始头指针,获取生产者子队列的尾指针作为生产者子队列第一尾指针,基于该消费者子队列初始头指针和该生产者子队列第一尾指针,确定该环形队列未空时,将该消费者子队列初始头指针加N作为新的消费者子队列的头指针,从该消费者子队列初始头指针开始依次将N个数据从该环形队列中清除,获取该消费者子队列的尾指针作为消费者子队列初始尾指针,确定该消费者子队列初始尾指针等于该消费者子队列初始头指针时,将该消费者子队列初始尾指针加N作为新的消费者子队列尾指针,出队完成,其中N为正整数。
需要说明的是,当环形队列未空时,消费者才能从环形队列中读取数据,当环形队列已空时,消费者不能从环形队列中读取数据,因此,当消费者有N个数据出队时,判断当前生产者子队列的尾指针是否等于该消费者子队列初始头指针,若是,则判定该环形队列已空,不能执行消费者的出队操作;否则,判定该环形队列未空,继续执行消费者的出队操作。
进一步的,当消费者有N个数据出队时,确定该环形队列未空之后,将该消费者子队列初始头指针加N作为新的消费者子队列的头指针之前,还要对消费者子队列头指针进行比较赋值的原子操作,具体过称为:获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于该消费者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取该消费者子队列的头指针作为消费者子队列初始头指针,获取该生产者子队列的尾指针作为生产者子队列第一尾指针,基于该消费者子队列初始头指针和该生产者子队列第一尾指针,确定该环形队列未空时,再次获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于该消费者子队列初始头指针,执行后续操作。
这样做的目的是能够进一步确保对该消费者子队列进行操作之前,第一次记录的消费者子队列头指针没有发生任何变化是准确的,若发生变化说明有其他消费者对生产者子队列的头指针进行了改变,为保证程序的准确性需要再次对消费者子队列头指针进行比较赋值的原子操作,直到对消费者子队列头指针进行比较赋值的原子操作成功时,才会继续后续的出队操作。
下面以图3为例来具体说明本发明实施例中的生产者入队流程,具体步骤如下所示,其中生产者子队列的头指针用producer.head表示,生产者子队列的尾指针用producer.tail表示,消费者子队列的尾指针用consumer.tail表示。
步骤30:读出此时生产者子队列的头指针和消费者子队列的尾指针并分别记录为producer_head、consumer_tail。
步骤31:判断环形队列是否已满,即判断当前的producer.head+1是否等于consumer.tail,若是,则表示环形队列已满,直接退出加入流程;否则,执行步骤32。
步骤32:对producer.head进行比较的原子操作,该操作先读取producer.head的值,再比较producer.head的值是否等于步骤30中记录的producer_head值,如果不等,则返回步骤30;如果相等,则执行步骤33。
步骤33:对producer.head进行赋值。把(producer_head+N)的值赋给producer.head(这里的N指将要产生的数据的个数),进入下一步。
步骤34:从producer_head指定的环形队列的位置开始,依次把N个数据插入到队列中。此时,相当于为生产者分配了一个长度为N的生产者子队列,于是,生产者可以安全的向生产者子队列生产数据,生产者把数据的起始地址保存到生产者子队列中。如果同时生产N个数据,则分别把N个数据的起始地址保存到长度为N的生产者子队列中,然后进入下一步。
步骤35:判断生产者子队列的尾指针producer.tail是否等于producer_head,如果不等,说明在本生产者之前,还有其它生产者在向队列生产数据,则需要等待前面所有生产者生产完数据后,即确定两者相等时,才能进入下一步操作;如果相等,说明前面生产者已经完成生产工作,本生产者可以进入下一步操作。
步骤36:把producer_head+N的值赋给producer.tail。
从上述描述过程可以看出,当同时有多个生产者时,每个生产者各自从环形队列的空闲部分中预留出一定的长度的子队列(长度就是要入队的数据的个数),然后每个生产者各自操作自已预留的那部分子队列,互不干扰,从而可以同时操作环形队列,达到多个生产者并发向环形队列保存数据的效果。
基于相同原理,消费者从环形队列取数据的流程如图4所示,具体步骤如下所示,其中消费者子队列的头指针用consumer.head表示,消费者子队列的尾指针用consumer.tail表示,生产者子队列的尾指针用producer.tail表示。
步骤40:读出此时消费者子队列的头指针和生产者子队列的尾指针并分别记录为consumer_head、producer_tail。
步骤41:判断环形队列是否为空,即判断当前的producer.head是否等于consumer.tail,若是,则表示环形队列为空则不能进入下一步操作,直接退出取数据流程;否则,执行步骤42。
步骤42:对consumer.head进行比较的原子操作,该操作先读取consumer.head的值,再比较consumer.head的值是否等于步骤40中记录的consumer_head值,如果不等,则返回步骤40;如果相等,则执行步骤43。
步骤43:对consumer.head进行赋值。把(consumer_head+N)的值赋给consumer.head(这里的N指将要取出的数据的个数),进入下一步。
步骤44:从consumer_head指定的环形队列的位置开始,依次把N个数据从环形队列中取出。此时,相当于为消费者分配了一个长度为N的消费者子队列,于是,消费者可以安全的从消费者子队列读取数据,消费者从消费者子队列中把数据的起始地址读出来,并用该起始地址去读取共享数据。如果同时有N个数据要读取,则分别把N个数据的起始地址读出,然后进入下一步。
步骤45:判断消费者子队列的尾指针consumer.tail是否等于consumer_head,如果不等,说明在本消费者之前,还有其它消费者在从环形队列中读取数据,则需要等待前面所有消费者读取完所有数据后,即确定两者相等时,才能进入下一步操作;如果相等,说明前面的消费者已经完成读取工作,本消费者可以进入下一步操作。
步骤46:把consumer_head+N的值赋给consumer.tail。
从上述描述过程可以看出,当同时有多个消费者时,每个消费者各自从环形队列的已存数据部分中预留出一定长度的子队列(长度就是要出队的数据的个数),然后每个消费者各自操作自已预留的那部分子队列,互不干扰,从而可以同时操作环形队列,达到多个消费者并发从环形队列读取数据的效果。
以上生产者和消费者的行为可以看出,只有在移动子队列的头指针域和尾指针域的时候,才存在竞争等待,而在向队列存数据和从队列取数据的过程中,可以并发访问,不存在等待,从而大大减少了竞争等待时间,达到提高多核系统效率的目的。
基于上述方法实施例,如图5所示,本发明实施例中提供一种多核环境下实现免锁队列的设备,包括:确定单元50、第一处理单元51和第二处理单元52,其中:
确定单元50,用于确定一个环形队列,所述环形队列的存储结构采用数组形式存储,所述环形队列包括生产者子队列和消费者子队列;
第一处理单元51,用于当生产者有M个数据入队时,获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针,从所述生产者子队列初始头指针开始依次将M个数据加入到所述环形队列中,获取所述生产者子队列的尾指针作为生产者子队列初始尾指针,确定所述生产者子队列初始尾指针等于所述生产者子队列初始头指针时,将所述生产者子队列初始尾指针加M作为新的生产者子队列尾指针,入队完成,其中M为正整数;
第二处理单元52,用于当消费者有N个数据出队时,获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针,从所述消费者子队列初始头指针开始依次将N个数据从所述环形队列中清除,获取所述消费者子队列的尾指针作为消费者子队列初始尾指针,确定所述消费者子队列初始尾指针等于所述消费者子队列初始头指针时,将所述消费者子队列初始尾指针加N作为新的消费者子队列尾指针,出队完成,其中N为正整数。
可选的,所述生产者子队列与所述消费者子队列均可以占据所述环形队列的任何存储空间,且针对所述生产者子队列和所述消费者子队列的操作方向相同。
可选的,所述确定单元50进一步用于:
在系统初始化阶段,将所述生产者子队列的头指针、所述生产者子队列的尾指针、所述消费者子队列的头指针和所述消费者子队列的尾指针均设置为所述环形队列对应的数组结构的第一个元素。
可选的,确定所述环形队列未满时,所述第一处理单元51具体用于:
当生产者有M个数据入队时,判断所述消费者子队列第一尾指针是否等于所述生产者子队列初始头指针加8,若是,则判定所述环形队列已满,不能执行生产者的入队操作;否则,判定所述环形队列未满,继续执行生产者的入队操作。
可选的,当生产者有M个数据入队时,在确定所述环形队列未满之后,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针之前,所述第一处理单元51进一步用于:
获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,再次获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,执行后续操作。
可选的,确定所述环形队列未空时,所述第二处理单元52具体用于:
当消费者有N个数据出队时,判断当前生产者子队列的尾指针是否等于所述消费者子队列初始头指针,若是,则判定所述环形队列已空,不能执行消费者的出队操作;否则,判定所述环形队列未空,继续执行消费者的出队操作。
可选的,当消费者有N个数据出队时,确定所述环形队列未空之后,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针之前,所述第二处理单元52进一步用于:
获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,再次获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,执行后续操作。
综上所述,本发明实施例多核环境下实现免锁队列的方法中在队列的入队和出队操作中,没有使用队列锁的机制独占队列,而是让多个模块同时访问队列的不同部分,从而有效解决了多生产者或多消费者并发访问时的冲突,减少了CPU核空等待的时间,进而提高了多核系统的效率。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。