System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本专利技术属于计算机数据结构领域,具体属于一种高并发高吞吐无等待环形队列数据存储方法。
技术介绍
1、随着多核技术的发展,设计高效的并发数据结构变得非常迫切。尤其针对微系统众核应用。传统的并发方式采用互斥锁或自旋锁技术,系统开销巨大,且容易引发死锁、优先级颠倒等问题。为了解决以上问题,非阻塞数据结构得到重点关注,其中无等待提供最高的非阻塞保证,确保每个线程都能在有限步之内完成任何操作。
2、当前的无等待技术最大问题在于其设计难、开销过大,在大多数场景下随着“保证”的提高,性能不断下降来满足其冗余设计。其一归因于大多数无等待算法采用的关键机制——“帮助机制”。这种机制控制线程相互帮助完成操作的方式,通常会导致复杂的算法,并额外使用更多的原子操作,产生很高的争用,增加开销。其次,帮助机制被设计为按顺序操作,因为所有并发运行的线程都以完全相同的顺序帮助其他操作。由于高冗余,导致大量无效运行。其二归因于内存回收机制,该机制用于释放已经完成所有操作的数据存储空间,从而达到理论上的无界限存储,然而频繁的内存申请和释放会在极端情景下造成存储越界与野指针,随着写线程数目的增加,存储空间将不再足够。
3、综上所述,现有技术中应用的无等待队列,其复杂的帮助机制和内存回收机制显著影响了线程运行效率,明显增加了极端情形下出错的可能性。
技术实现思路
1、为了解决现有技术中存在的问题,本专利技术提供一种高并发高吞吐无等待环形队列数据存储方法,用于解决
技术介绍
中的问题,本专利技术以在多
2、为实现上述目的,本专利技术提供如下技术方案:
3、一种高并发高吞吐无等待环形队列数据存储方法,包括以下步骤,
4、步骤1,对环形队列结构进行初始化;
5、步骤2,通过原子操作和位运算获取当前位置索引;
6、步骤3,判断该索引指向的存储内容是否满足读写条件,若满足转向步骤4,不满足转向步骤5;
7、步骤4,写入或读出数据;
8、步骤5,操作失败,不对索引指向的内容做任何修改,直接返回。
9、优选的,步骤1中,进行变量初始化,根据机器指令长度对齐字节,对齐后初始化读索引变量与写索引变量为零。
10、进一步的,当机器为32位机器时,则对齐方式为32;当机器为64位机器时,则对其方式为64。
11、优选的,步骤1中,对存储空间进行初始化,用户自定义环形缓冲区大小。
12、优选的,步骤2中,获取当前位置索引具体包括以下过程,通过fetch_and_add原子操作移动写索引位置,自动原子地将参数1添加到存储在原子对象中的值,并获得先前保存的值;同时由于采用环形缓冲区,获取的索引应和缓冲区大小进行取余操作,从而快速得到真正的索引位置。
13、优选的,步骤4中,写入数据具体包括以下过程,在缓冲区每个位置上设置特殊标识符⊥,其表示此处为空,可存入数据;
14、写入数据时比较该索引位置是否指向特殊标识符⊥,如果是则经由compare_and_swap原子操作尝试存储数据,若原子操作成功返回true;其余情况均视为失败,说明该位置已有其他生产者线程先一步存入数据,直接返回false。
15、优选的,步骤4中,读出数据具体包括以下过程,获取位置索引,首先通过fetch_and_add原子操作移动读索引位置,索引值原子地自动加1,并返回当前读索引的值;
16、检查此位置是否指向特殊标识符⊥,如果不是则说明此处有正常数据需要取出,需先取出数据,接着将此处重新设置为特殊标识符⊥,最后返回true;其余情况均视作执行失败,代表此处并没有数据,返回false即可。
17、优选的,步骤4中,写入或读出数据的数据类型相同。
18、优选的,步骤4中,写入数据线程为一个或多个,读出数据线程为一个。
19、与现有技术相比,本专利技术具有以下有益的技术效果:
20、本专利技术提供一种高并发高吞吐无等待环形队列数据存储方法,通过简便设计,大大提升访问共享存储区域的吞吐量,且稳定支持多线程同步运行。本专利技术完全避免帮助机制,将数据吞吐量提升50%~100%,可以稳定适配数据高速吞吐的应用场景;本专利技术采用环形队列,在运行中不需要额外申请存储空间,空间复杂度低,可应用于性能严重受限的嵌入式设备;本专利技术代码复杂度低,代码可读性高,方便用户后期维护。(研究表明程序的可能错误和高的复杂度有着很大关系,复杂度最高的模块和方法,其缺陷个数也可能最多。复杂度大说明程序代码的判断逻辑复杂,可能质量低,且难于测试和维护。)本方法克服这一缺点,特别适合微系统嵌入式领域等缺乏支撑软件环境的应用。本专利技术运行稳定,性能指标不会随着线程数激增而下降。
本文档来自技高网...【技术保护点】
1.一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,包括以下步骤,
2.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,进行变量初始化,根据机器指令长度对齐字节,对齐后初始化读索引变量与写索引变量为零。
3.根据权利要求2所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,当机器为32位机器时,则对齐方式为32;当机器为64位机器时,则对其方式为64。
4.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,对存储空间进行初始化,用户自定义环形缓冲区大小。
5.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤2中,获取当前位置索引具体包括以下过程,通过fetch_and_add原子操作移动写索引位置,自动原子地将参数1添加到存储在原子对象中的值,并获得先前保存的值;同时由于采用环形缓冲区,获取的索引应和缓冲区大小进行取余操作,从而快速得到真正的索引位置。
6.根据权利要求1所述的一种高并发高吞吐无等待
7.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤4中,读出数据具体包括以下过程,获取位置索引,首先通过fetch_and_add原子操作移动读索引位置,索引值原子地自动加1,并返回当前读索引的值;
8.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤4中,写入或读出数据的数据类型相同。
9.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤4中,写入数据线程为一个或多个,读出数据线程为一个。
...【技术特征摘要】
1.一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,包括以下步骤,
2.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,进行变量初始化,根据机器指令长度对齐字节,对齐后初始化读索引变量与写索引变量为零。
3.根据权利要求2所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,当机器为32位机器时,则对齐方式为32;当机器为64位机器时,则对其方式为64。
4.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤1中,对存储空间进行初始化,用户自定义环形缓冲区大小。
5.根据权利要求1所述的一种高并发高吞吐无等待环形队列数据存储方法,其特征在于,步骤2中,获取当前位置索引具体包括以下过程,通过fetch_and_add原子操作移动写索引位置,自动原子地将参数1添加到存储在原子对象中的值,并获得...
【专利技术属性】
技术研发人员:李珂,匡乃亮,杨启迪,罗迒哉,钟升,
申请(专利权)人:西安微电子技术研究所,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。