一种并发哈希表的无锁操作方法

文档序号:10687143阅读:292来源:国知局
一种并发哈希表的无锁操作方法
【专利摘要】为了提升多线程对哈希表操作的高效性,本发明提供一种并发哈希表的无锁操作方法。当需要对哈希表进行插入操作时,首先构造新增的值对象,并将对象中的next指针指向键值对应的哈希槽中的指针指向的对象,同时利用原子操作将对应哈希槽中的指针指向新增的对象;当需要对哈希表进行删除操作时,利用原子操作将对应的对象从链表中移除;当需要对哈希表进行更新操作时,首先构造需要更新的对象的副本,并进行更新,同时原子地将更新后的对象插入到链表中;对于删除对象的回收,利用Hazard指针实现。
【专利说明】
一种并发哈希表的无锁操作方法
技术领域
[0001]本发明涉及计算机算法领域,涉及一种可动态扩大和缩小的并发哈希表的无锁操作方法。
【背景技术】
[0002]随着网络信息化水平的不断提高,信息系统处理的数量按照指数级增长,在以实时计算为核心的网络数据处理架构中,最新的数据才具备最高价值,因此不可避免的采用并发哈希表,在多个线程中对哈希表进行查找和插入更新删除等操作,因此需要一种快速的并发哈希表无锁操作方法。
[0003]哈希表是根据关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。传统的并发哈希表可采用锁的方式实现同步,在每次需要对哈希表进行操作时,都先获取锁,操作完成后再释放锁。加锁方式有自旋锁和阻塞式锁等两种。其中,第一种方式以无限循环查询等待方式完成,过多占用(PU资源,而第二种方式,容易产生线程或进程上下文切换,降低处理速度。

【发明内容】

[0004]为了提升多线程对哈希表操作的高效性,解决上述技术问题,本发明提供一种并发哈希表的无锁操作方法。
[0005 ]本发明通过以下技术方案解决上述技术问题。
[0006]—种并发哈希表的无锁操作方法,包括插入操作、更新操作、删除操作;其中:
[0007]插入操作具体包括如下步骤:
[0008]1.1获取新插入元素键值对应的哈希槽,执行1.2;
[0009]1.2获取哈希槽中存储的链表的表头,执行1.3;
[0010]1.3构造新的值对象,将对象的next指针指向1.2中获得的表头对象,执行1.4;
[0011 ]1.4利用CAS操作将哈希槽中的指针指向新建的对象;
[0012]更新操作具体包括如下步骤:
[0013]2.1获取需要更新的元素的键值,执行2.2;
[0014]2.2获取键值对应的哈希槽中存储的链表表头,执行2.3;
[0015]2.3在链表中查找对应的需要更新的对象,执行2.4;
[0016]2.4构造对象的副本,并进行更新,执行2.5;
[0017]2.5将更新后的对象的next指针指向原对象的next指针指向的对象,执行2.6 ;
[0018]2.6利用原子操作将新对象插入到链表中;
[0019]删除操作具体包括如下步骤:
[0020]3.1获取需要删除的元素的键值,执行3.2;
[0021 ]3.2获取键值对应的哈希槽中存储的链表表头,执行3.3;
[0022]3.3在链表中查找对应的需要删除的对象,执行3.4;
[0023]3.4利用原子操作将需要删除对象的前一个对象的next指针指向删除对象的下一个对象。
[0024]本发明的有益效果:
[0025]本发明基于CPU或操作系统提供的compare_and_swap原语,实现并发哈希表的插入、查询、删除等操作,提供高效的读写操作,避免占用过多CPU资源或上下文切换带来的开销。
【具体实施方式】
[0026]下面对本发明作更详细的描述:
[0027]当需要对哈希表进行插入操作时,首先构造新增的值对象,并将对象中的next指针指向键值对应的哈希槽中的指针指向的对象,同时利用原子操作将对应哈希槽中的指针指向新增的对象;当需要对哈希表进行删除操作时,利用原子操作将对应的对象从链表中移除;当需要对哈希表进行更新操作时,首先构造需要更新的对象的副本,并进行更新,同时原子地将更新后的对象插入到链表中。对于删除对象的回收,利用Hazard指针实现。
[0028]无锁操作使用计算机中compare_and_swap(指定位置,旧值,新值)原语实现,由CPU制造商或操作系统提供,当指定位置所示的值等于旧值时,将新值放置到指定位置,并返回新值,否则返回旧值。
[0029]下面使用具体实施例对哈希表的插入、删除、更新操作进行描述。
[0030]插入操作如下:
[0031](I)获取新插入元素键值对应的哈希槽,执行(2);
[0032](2)获取哈希槽中存储的链表的表头,执行(3);
[0033](3)构造新的值对象,将对象的next指针指向(2)中获得的表头对象,执行(4);
[0034](4)利用CAS操作将哈希槽中的指针指向新建的对象;
[0035]更新操作如下:
[0036](I)获取需要更新的元素的键值,执行(2);
[0037](2)获取键值对应的哈希槽中存储的链表表头,执行(3);
[0038](3)在链表中查找对应的需要更新的对象,执行(4);
[0039](4)构造对象的副本,并进行更新,执行(5);
[0040](5)将更新后的对象的next指针指向原对象的next指针指向的对象,执行(6);
[0041 ] (6)利用原子操作将新对象插入到链表中。
[0042]删除操作如下:
[0043](I)获取需要删除的元素的键值,执行(2);
[0044](2)获取键值对应的哈希槽中存储的链表表头,执行(3);
[0045](3)在链表中查找对应的需要删除的对象,执行(4);
[0046](4)利用原子操作将需要删除对象的前一个对象的next指针指向删除对象的下一个对象。
【主权项】
1.一种并发哈希表的无锁操作方法,包括插入操作、更新操作、删除操作;其特征在于,其中: 插入操作具体包括如下步骤: .1.1获取新插入元素键值对应的哈希槽,执行1.2; .I.2获取哈希槽中存储的链表的表头,执行1.3; .1.3构造新的值对象,将对象的next指针指向1.2中获得的表头对象,执行1.4; I.4利用CAS操作将哈希槽中的指针指向新建的对象; 更新操作具体包括如下步骤: .2.1获取需要更新的元素的键值,执行2.2; .2.2获取键值对应的哈希槽中存储的链表表头,执行2.3; .2.3在链表中查找对应的需要更新的对象,执行2.4; .2.4构造对象的副本,并进彳丁更新,执彳丁2.5; .2.5将更新后的对象的next指针指向原对象的next指针指向的对象,执行2.6 ; .2.6利用原子操作将新对象插入到链表中; 删除操作具体包括如下步骤: . 3.1获取需要删除的元素的键值,执行3.2; .3.2获取键值对应的哈希槽中存储的链表表头,执行3.3; .3.3在链表中查找对应的需要删除的对象,执行3.4;. 3.4利用原子操作将需要删除对象的前一个对象的next指针指向删除对象的下一个对象。
【文档编号】G06F17/30GK106055646SQ201610377615
【公开日】2016年10月26日
【申请日】2016年5月31日
【发明人】卫冰洁, 王啸, 熊刚, 贺欣, 石俊峥, 刘培朋, 李镇, 周立, 王秀文, 贺龙涛, 李晓倩, 袁媛, 朱佳伟, 李城龙, 张慧, 曹首峰, 于贺威, 王大伟, 刘阳
【申请人】国家计算机网络与信息安全管理中心
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1