[发明专利]一种基于单进单出无锁队列的随机取出对象的方法有效
申请号: | 202110294432.8 | 申请日: | 2021-03-19 |
公开(公告)号: | CN113176896B | 公开(公告)日: | 2022-12-13 |
发明(设计)人: | 陈稳 | 申请(专利权)人: | 中盈优创资讯科技有限公司 |
主分类号: | G06F9/38 | 分类号: | G06F9/38 |
代理公司: | 上海嘉蓝专利代理事务所(普通合伙) 31407 | 代理人: | 金波 |
地址: | 200000 上海市嘉定区安*** | 国省代码: | 上海;31 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 单进单出无锁 队列 随机 取出 对象 方法 | ||
本发明公开一种基于单进单出无锁队列的随机取出对象的方法,其中,该方法包括:对size大小的对象池进行内存布局;将对象指针数组p[size]划分为使用区间[HEAD,TAIL]和空闲区间;消费者线程取出p[N]指向的对象(N∈[HEAD,TAIL]),并且在使用完毕之后释放。该方法相比于现有单进单出无锁队列,它多具备了“支持异步无锁/同步随机取出”、“已分配区间即队列”和“空闲对象无须查找”三个特点,将现有单进单出无锁队列的应用场景扩展到“网络会话管理”这类需求,并且还具有性能优势。
技术领域
本发明涉及单进单出无锁队列领域,尤其是一种基于单进单出无锁队列的随机取出对象的方法。
背景技术
单进单出无锁队列,是一种已经存在的算法,支持单生产者线程向HEAD位置添加对象,单消费者线程从TAIL位置取出对象,如图1所示。
但是,现有单进单出无锁队列,同时也是FIFO(first in first out)队列,即消费者线程只可以固定从TAIL位置取出对象,不可以越过TAIL位置,在[HEAD,TAIL)区间执行取出对象操作,如图2所示。
发明内容
为克服现有单进单出无锁队列存在的上述问题,本发明提供一种基于单进单出无锁队列的随机取出对象的方法,可以从[HEAD,TAIL]区间随机取出对象。
为实现上述目的,本发明采用下述技术方案:
在本发明一实施例中,提出了一种基于单进单出无锁队列的随机取出对象的方法,该方法包括:
对size大小的对象池进行内存布局;
将对象指针数组p[size]划分为使用区间[HEAD,TAIL]和空闲区间;
消费者线程取出p[N]指向的对象(N∈[HEAD,TAIL]),并且在使用完毕之后释放。
进一步地,对size大小的对象池进行内存布局,包括:
对象池前面部分为对象指针数组p[size],后面部分为对象实体数组obj[size];
设置对象指针数组p[size]中的各个指针指向;
设置对象实体数组obj[size]中每个对象实体携带的隐式尾部pos指向;
将对象指针数组p[size]实现为无锁环形队列。
进一步地,设置对象指针数组p[size]中的各个指针指向,包括:
设置对象指针数组p[size]中的各个指针,指向对象实体数组obj[size]中对应下标处的对象。
进一步地,设置对象实体数组obj[size]中每个对象实体携带的隐式尾部pos指向,包括:
让对象实体数组obj[size]中每个对象实体携带一个隐式尾部pos,用于存储指向该对象的指针,在对象指针数组p[size]中的下标值,使得对象池刚建立时,形成对象指针与对象实体的相互映射关系。
进一步地,将对象指针数组p[size]划分为使用区间[HEAD,TAIL]和空闲区间,包括:
[HEAD,TAIL]为使用区间,指向生产者线程添加且未被消费者线程取出的对象,其余部分为空闲区间,指向空闲对象。
进一步地,消费者线程取出p[N]指向的对象(N∈[HEAD,TAIL]),并且在使用完毕之后释放,包括:
执行释放操作前的使用区间状态;
交换p[N]与p[TAIL]的值;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中盈优创资讯科技有限公司,未经中盈优创资讯科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110294432.8/2.html,转载请声明来源钻瓜专利网。