一种多线程安全高效读写有序数据的方法技术

技术编号:28498577 阅读:20 留言:0更新日期:2021-05-19 22:37
本发明专利技术提供了一种多线程安全高效读写有序数据的方法,其特征在于,包括以下步骤:利用读线程实现对容器内存储数据的读操作,同时利用与读线程不同的写线程实现对同一容器内存储数据的写操作,对容器的读操作与写操作同时进行。本发明专利技术针对数据处理领域中对存储在某一容器内的数据进行各种排序来进行数据分析的情况,设计了一种多线程安全高效读写有序数据的方法。采用本发明专利技术的技术方案后,一系列的数据在多线程的情况下任意一列的数据可以进行有序地存储与读取,实现读写同时进行以及多线程读写安全的无锁容器。程读写安全的无锁容器。程读写安全的无锁容器。

【技术实现步骤摘要】
一种多线程安全高效读写有序数据的方法


[0001]本专利技术涉及一种读线程与写线程同时对存储于同一容器内的数据进行读写操作的方法。

技术介绍

[0002]随着计算的硬件的不断发展,CPU所采用的多核结构带来了计算机工作模式的重大改革,使得计算机的性能得到很大提升,原有的单线程模式已经可以在多核情况下并行工作。数据在任何领域系统中都是存在的,如何去高效地读写数据是任何领域系统中都必须要解决的问题。在数据处理领域,对存储在某一容器内的数据进行各种排序来进行数据分析,这种情况非常普遍。
[0003]在现有的技术方案中,对存储于同一容器内的数据进行读写操作采用以下两种模式之一:如图1所示,为单线程情况下的工作模式。在该工作模式下,只有一个线程在对存储于容器内的数据进行读、写操作,因而读写不能同时进行,读和写是互斥的,从容器中读出数据的时候不能将数据写入同一容器中,在将数据写入容器的时候不能将数据从同一容器中读出。
[0004]如图2所示,为多核情况下多线程的读写工作模式。在该工作模式下,对同一容器内存储的数据进行的读操作和写操作是在不同线程中进行的。为了解决两个线程相互冲突的问题,上述读写工作模式引入锁来解决,读线程与写线程同时抢占资源,若读线程先抢占到锁,则进行读操作,反之若写线程先抢占到锁,则进行写操作。图2所示的工作模式,虽然是两个线程在工作,但读线程与写线程的操作是互斥的,不能同时进行,性能上得不到提升。

技术实现思路

[0005]本专利技术要解决的技术问题是:在现有的多核情况下多线程的读写工作模式中,读线程与写线程的操作是互斥的。
[0006]为了解决上述技术问题,本专利技术的技术方案是提供了一种多线程安全高效读写有序数据的方法,其特征在于,包括以下步骤:
[0007]容器利用N个Node数据节点来存储任意数据类型的数据,N≥3,每个Node数据节点包含Previous字段、Key字段、Value字段及Next字段,第n个Node数据节点的Previous字段用于存储指向第(n

1)个Node数据节点的指针,第n个Node数据节点的Key字段用于存储按照场景的需求需要排序的值,定义为Key值,第n个Node数据节点的Value字段用于存储Key字段的值对应的数据值,定义为Value值,第n个Node数据节点的Next字段用于存储指向第(n+1)个Node数据节点的指针,N=2,

,(N

1);所有Node数据节点按照Key字段的值在容器内排序;
[0008]利用读线程实现对容器内存储数据的读操作,同时利用与读线程不同的写线程实现对同一容器内存储数据的写操作,对容器的读操作与写操作同时进行,其中:对容器的写
操作包括以下步骤:
[0009]步骤101:获得待存储的数据的Key值及与Key值相对应的Value值,创建一个Node数据节点;
[0010]新创建的Node数据节点的Previous字段及Next字段为空,将Key值存入新创建的当前Node数据节点的Key字段,将Value值存入新创建的当前Node数据节点的Value字段;
[0011]步骤102:将新创建的Node数据节点的Key字段的值与容器内已存在的所有Node数据节点的Key字段的值进行匹配,若匹配成功,则进入步骤103,若匹配失败,则进入步骤104;
[0012]步骤103:将匹配到的已存在的Node数据节点的Key字段的值以及Value字段的值用新创建的Node数据节点的Key字段的值以及Value字段的值覆盖,返回步骤101;
[0013]步骤104:设容器内已存储有K个Node数据节点,2≤K≤N,查找与新创建的Node数据节点的Key字段的值相匹配的Key值区间,Key值区间为由容器内已存储的相邻两个Node数据节点的Key字段的值组成的区间;
[0014]设V
k
表示容器内已有的第k个Node数据节点的Key字段的值,k=2,

,K,新创建的Node数据节点的Key字段的值为V;
[0015]设容器内已有K个Node数据节点按照Key字段的值降序排列,则有:
[0016]若V∈(V
k
,V
k
‑1),则V与Key值区间(V
k
,V
k
‑1)相匹配,此时,先将新创建的Node数据节点的Previous字段的指针指向容器内已有的第(k

1)个Node数据节点,将新创建的Node数据节点的Next字段的指针指向容器内已有的第k个Node数据节点,再将容器内已有的第(k

1)个Node数据节点的Next字段的指针指向新创建的Node数据节点,将容器内已有的第k个Node数据节点的Previous字段的指针指向新创建的Node数据节点;
[0017]若V>V1,则V与Key值区间(V1,+∞)相匹配,此时,先将新创建的Node数据节点的Next字段的指针指向容器内已有的第1个Node数据节点,再将容器内已有的第1个Node数据节点的Previous字段的指针指向新创建的Node数据节点;
[0018]若V<V
K
,则V与Key值区间(

∞,V
K
)相匹配,此时,先将新创建的Node数据节点的Previous字段的指针指向容器内已有的第K个Node数据节点,再将容器内已有的第K个Node数据节点的Next字段的指针指向新创建的Node数据节点;
[0019]设容器内已有K个Node数据节点按照Key字段的值升序排列,则有:
[0020]若V∈(V
k
‑1,V
k
),则V与Key值区间(V
k
‑1,V
k
)相匹配,此时,先将新创建的Node数据节点的Previous字段的指针指向容器内已有的第(k

1)个Node数据节点,将新创建的Node数据节点的Next字段的指针指向容器内已有的第k个Node数据节点,再将容器内已有的第(k

1)个Node数据节点的Next字段的指针指向新创建的Node数据节点,将容器内已有的第k个Node数据节点的Previous字段的指针指向新创建的Node数据节点;
[0021]若V<V1,则V与Key值区间(

∞,V1)相匹配,此时,先将新创建的Node数据节点的Next字段的指针指向容器内已有的第1个Node数据节点,再将容器内已有的第1个Node数据节点的Previous字段的指针指向新创建的Node数据节点;
[0022]若V>V
K
,则V与Key值区间(V
K
,+∞)相匹配,此时,先将新创建的Node数据本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种多线程安全高效读写有序数据的方法,其特征在于,包括以下步骤:容器利用N个Node数据节点来存储任意数据类型的数据,N≥3,每个Node数据节点包含Previous字段、Key字段、Value字段及Next字段,第n个Node数据节点的Previous字段用于存储指向第(n

1)个Node数据节点的指针,第n个Node数据节点的Key字段用于存储按照场景的需求需要排序的值,定义为Key值,第n个Node数据节点的Value字段用于存储Key字段的值对应的数据值,定义为Value值,第n个Node数据节点的Next字段用于存储指向第(n+1)个Node数据节点的指针,N=2,

,(N

1);所有Node数据节点按照Key字段的值在容器内排序;利用读线程实现对容器内存储数据的读操作,同时利用与读线程不同的写线程实现对同一容器内存储数据的写操作,对容器的读操作与写操作同时进行,其中:对容器的写操作包括以下步骤:步骤101:获得待存储的数据的Key值及与Key值相对应的Value值,创建一个Node数据节点;新创建的Node数据节点的Previous字段及Next字段为空,将Key值存入新创建的当前Node数据节点的Key字段,将Value值存入新创建的当前Node数据节点的Value字段;步骤102:将新创建的Node数据节点的Key字段的值与容器内已存在的所有Node数据节点的Key字段的值进行匹配,若匹配成功,则进入步骤103,若匹配失败,则进入步骤104;步骤103:将匹配到的已存在的Node数据节点的Key字段的值以及Value字段的值用新创建的Node数据节点的Key字段的值以及Value字段的值覆盖,返回步骤101;步骤104:设容器内已存储有K个Node数据节点,2≤K≤N,查找与新创建的Node数据节点的Key字段的值相匹配的Key值区间,Key值区间为由容器内已存储的相邻两个Node数据节点的Key字段的值组成的区间;设V
k
表示容器内已有的第k个Node数据节点的Key字段的值,k=2,

,K,新创建的Node数据节点的Key字段的值为V;设容器内已有K个Node数据节点按照Key字段的值降序排列,则有:若V∈(V
k
,V
k
‑1),则V与Key值区间(V
k
,V
k
‑1)相匹配,此时,先将新创建的Node数据节点的Previous字段的指针指向容器内已有的第(k

1)个Node数据节点,将新创建的Node数据节点的Next字段的指针指向容器内已有的第k个Node数据节点,再将容器内已有的第(k

1)个Node数据节点的Next字段的指针指向新创建的Node数据节点,将容器内已有的第k个Node数据节点的Previous字段的指针指向新创建的Node数据节点;若V>V1,则V与Key值区间(V1,+∞)相匹配,此时,先将新创建的Node数据节点的Next字段的指针指向容器内已有的第1个Node数据节点,再将容器内已有的第1个Node数据节点的Previous字段的指针指向新创建的Node数据节点;若V<V
K
,则V与Key值区间(

∞,V
K
)相匹配,此时,先将新创建的Node数据节点的Previous字段的指针指向容器内已有的第K个Node数据节点,再将容器内已有的第K个Node数据节点的Next字段的指针指向新创建的Node数据节点;设容器内已有K个Node数据节点按照Key字段的值升序排列,则有:若V∈(V
k
‑1,V
k
),则V与Key值区间(V
k
‑1,V
k
)相匹配,此时,先将新创建的Node数据节点的Previous字段的指针指向容器内已有的第(k

1)个Node数据节点,将新创建的Node数据节
点的Next字段的指针指向容器内已有的第k个Node数据节点,再将容器内已有的第(k

1)个Node数据节点的Next字段的指针指向新创建的Node数据节点,将容器内已有的第k个Node数据节点的Previous字段的指针指向新创建的Node数据节点;若V<V1,则V与Key值区间(

∞,V1)相匹配,此时,先将新创建的Node数据节点的Next字段的指针指向容器内已有的第1个Node数据节点,再将容器内已有的第1个Node数据节点的Previous字段的指针指向新创建的Node数据节点;若V>V
K
,则V与Key值区间(V
K
,+∞)相匹配,此时,先将新创建的Node数据节点的Previous字段的指针指向容器内已有的第K个Node数据节点,再将容器内已有的第K个Node数据节点的Next字段的指针指向新创建的Node数据节点;对容器的读操作包括以下步骤:获得待读取数据的Key值,通过二分法获得容器中Key字段的值与该Key值相匹配的Node数据节点,利用二分法进行匹配时,将待读取数据的Key值不...

【专利技术属性】
技术研发人员:吴洪王俊华刘茂军
申请(专利权)人:万得信息技术股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1