CN109783243A - 一种基于正副本切换的多线程数据无锁读写方法 - Google Patents
一种基于正副本切换的多线程数据无锁读写方法 Download PDFInfo
- Publication number
- CN109783243A CN109783243A CN201811628744.2A CN201811628744A CN109783243A CN 109783243 A CN109783243 A CN 109783243A CN 201811628744 A CN201811628744 A CN 201811628744A CN 109783243 A CN109783243 A CN 109783243A
- Authority
- CN
- China
- Prior art keywords
- copy
- module
- pointer
- internal storage
- duplicate
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 25
- 230000004048 modification Effects 0.000 claims description 5
- 238000012986 modification Methods 0.000 claims description 5
- 230000006870 function Effects 0.000 claims description 4
- 230000002159 abnormal effect Effects 0.000 claims description 3
- 238000012217 deletion Methods 0.000 claims description 3
- 230000037430 deletion Effects 0.000 claims description 3
- 230000001360 synchronised effect Effects 0.000 claims description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000002860 competitive effect Effects 0.000 description 2
- 239000002699 waste material Substances 0.000 description 2
- 238000000151 deposition Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- VIKNJXKGJWUCNN-XGXHKTLJSA-N norethisterone Chemical compound O=C1CC[C@@H]2[C@H]3CC[C@](C)([C@](CC4)(O)C#C)[C@@H]4[C@@H]3CCC2=C1 VIKNJXKGJWUCNN-XGXHKTLJSA-N 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明一种基于正副本切换的多线程数据无锁读写方法涉及计算机技术领域,特别是一种多线程数据无锁读写的方法。包括内存数据正本模块、内存数据副本模块、内存数据副本保留模块、写操作和正副本切换模块、以及工作模块。读写方法包括1)在程序初始化阶段,先一次性将现有数据写入内存数据正本模块,并拷贝一份至内存数据副本模块;2)后续建立进行读操作、写操作和正副本切换操作的工作线程;3)具体进行写操作和正副本切换操作的工作线程,并更新内存数据副本模块和内存数据副本保留模块。
Description
技术领域
本发明一种基于正副本切换的多线程数据无锁读写方法涉及计算机技术领域,特别是一种多线程数据无锁读写的方法。
背景技术
为了提高系统/程序的并发处理效率,人们往往会采用多线程的方法。相比于单线程的处理程序,多线程处理程序能够将程序中相互独立的不同事件交给不同的线程进行处理,多个事件并发执行,节省了时间开销,极大地提高程序的性能。但多线程不可避免的会存在竞争关系,例如多个线程需要对同一内存块进行读写访问。如果不能对竞争同一内存块的多线程进行有效控制,内存数据被多个线程毫无规则的进行修改,则会造成内存块中数据异常,乃至一些不可预知的错误。
针对多线程的资源竞争问题,一般采取线程锁的办法。使用线程锁,能够有效地控制同一时间段内对内存进行读写的线程。当某个线程对内存资源进行操作时,对该资源上锁,表示已经被占用。防止其他线程此时对内存进行修改。
线程锁能够有效合理的控制多线程的资源竞争,使程序能够符合预期的执行任务。但是线程锁的上锁和解锁会造成一部分时间开销,并且随着竞争资源的线程数量、对竞争资源的访问频率增加时,上锁的频率,次数也会线性上涨。这样线程锁本身的时间开销会越来越大。
发明内容
本发明的目的是针对上述不足之处提供一种基于正副本切换的多线程数据无锁读写方法,能够解决对内存的竞争问题,通过无锁的方法读写某一块内存数据,在保证程序的正确性的同时,利用多线程的特性提高程序的性能;因为该方法是无锁的,所以不会因为线程数量、访问频率的增加而增加额外的时间开销。
本发明是采取以下技术方案实现的:
一种基于正副本切换的多线程数据无锁读写系统,包括内存数据正本模块、内存数据副本模块、内存数据副本保留模块、写操作和正副本切换模块、以及工作模块。
内存数据正本模块,又称待读写内存数据的正本指针模块,简称正本指针,用于在该模块内进行待读写内存数据所有的增加、删除和修改的操作。
内存数据副本模块,又称内存数据的副本指针模块,简称副本指针,用于在该模块内进行内存数据的所有读取操作。
内存数据副本保留模块,又称内存数据副本的保留指针模块,简称保留指针,用于临时存放当前副本的指针,并保留一个正副本切换周期。
写操作和正副本切换模块包括写操作子模块和正副本切换子模块,写操作子模块用于负责在内存数据正本模块中按上述方法进行数据的增加、修改或删除操作;正副本切换子模块用于负责每隔一个周期将正本、副本和保留的数据进行更新同步。
工作模块即一般的工作线程,负责从内存数据副本模块中取出数据进行具体的业务逻辑功能实现。
一种基于正副本切换的多线程数据无锁读写方法,包括如下步骤,
1)在程序初始化阶段,先一次性将现有数据写入内存数据正本模块,并拷贝一份至内存数据副本模块;
2)后续建立进行读操作、写操作和正副本切换操作的工作线程;其中写操作和正副本切换操作安排在相同且唯一的工作线程当中,循环执行;写操作和正副本切换操作,这两个操作按先后顺序执行,保证写操作和正副本切换操作无需加锁;读操作则安排在多个工作线程中循环执行,由于读操作实际是指针赋值,属于原子操作,无须进行加锁;
3)在写操作和正副本切换操作的工作线程中,规定一个正副本切换周期和一个写操作周期,其中切换操作周期的时长大于写操作周期;在一个切换操作周期内,每隔一个写操作周期进行一次正本数据更新操作;当一个切换操作周期过完后,进行一次正副本切换操作,更新内存数据副本模块和内存数据副本保留模块。
所述步骤3)中所述的正副本切换流程,包括如下步骤:
3-1)清空保留指针;
判断保留指针是否为空,如果是则跳过,否则将保留指针的内存空间都释放掉;
3-2)更新接管保留指针;
将副本指针的值赋给保留指针,保留至下一次正、副本切换;
3-3)生成新的副本指针;
先将正本指针的内存空间拷贝一份至临时指针,然后将临时指针赋给副本指针。
步骤3-2)中的指针赋值是原子操作,能够确保此次操作前后期间的读操作不会异常。
步骤3-3)中的指针赋值是原子操作,能够保证此次操作前后期间的读操作读取到的数据是新副本或老副本其中之一,不会读取到异常数据。
发明优点:本发明通过正副本切换的方法,将读操作和写操作的目标分离开来,不会出现多线程资源竞争的情况,无需使用线程锁编程,从而避免了使用锁带来的CPU性能的浪费和各种难以发现或调试的问题,提高了读取数据的准确性和高效性。同时提供了延时功能,在一个正副本切换周期内可以对正本指针进行若干次新增、更新以及撤销删除等操作,只有切换周期过完之后才进行副本更新,增加数据的可操作性。
附图说明
以下将结合附图对本发明作进一步说明:
图1是本发明方法的流程图和各模块的原理框图。
具体实施方式
下面将结合附图,对本发明的具体实现细节做详细说明。需要注意的是,本发明适用于,但是不局限于下文所描述的数据结构、模块组成等,只要符合本发明思想的应用场景都能适用。
本发明方法主要涉及的功能模块有内存数据正本模块、内存数据副本模块、内存数据副本保留模块、写操作和正副本切换模块,以及若干工作模块。
本实施例中正、副本的数据结构为一个哈希表模板类HashTableOneDime,相当于一个以哈希值为下标的数组,其伪代码如下:template<typename stType> class HashTableOneDime { public:
各种成员方法
…
DataSlot<stType> *_pSlot; };其中类型DataSlot是一个槽模板类,成员_pSlot用来存放数据,一个哈希值对应一个槽位,相同哈希值存放在同一个槽位中。DataSlot的伪代码如下:template<typename stType> class DataSlot { public:
各种成员方法
…
DList<stType> stData; };DataSlot模板类中的stData成员的类型是一个模板链表类,用来存放实际数据的链表指针。当需要写数据时,根据数据特征值,利用散列算法(例如本例中取数据的IP作为特征值,将IP值与哈希表长度进行取模运算)算出哈希值,找到HashTableOneDime类中_pSlot成员的对应槽位,按顺序将该数据的节点指针挂载至stData链表成员的尾节点后面;当需要读取、修改或删除数据时,同样先根据特征值算出哈希值,定位到_pSlot的对应槽位上,然后遍历槽位中链表成员的所有数据节点,取出特征值相同的节点即为所需操作的数据,对其进行修改、删除等操作即可。
写操作和正副本切换工作模块被安排在唯一的一个工作线程内,写操作模块负责在正本中按上述方法进行数据的增加、修改或删除操作;正副本切换模块负责每隔一个周期将正本、副本和保留的数据进行更新同步,实现方法在技术方案中已做说明。
工作模块即一般的工作线程,负责从副本中取出数据进行具体的业务逻辑功能实现。因为取数据的操作实际上为指针赋值,属于原子操作,所以不用担心资源竞争的问题。工作模块的具体实现内容与本发明关联不大,在此便不做赘述。
本发明中读写操作分开的意义在于:根据实际应用场景的不同,待读写的内存数据结构可能比较复杂,对其进行写操作不是原子操作。而读写操作同时进行的话则必须加锁,否则难免会导致不可预知的问题。而加锁的话就会存在背景技术中存在的CPU性能浪费和效率降低的问题。
本发明中保留副本指针的意义在于:如果不保留副本指针,直接释放其内存空间,然后再拷贝一份正本指针的内存空间至副本指针,那么为了防止在释放和重新拷贝两个操作之间进行读操作又必须加锁,因此又会导致上述的弊端。
Claims (5)
1.一种基于正副本切换的多线程数据无锁读写系统,其特征在于:包括内存数据正本模块、内存数据副本模块、内存数据副本保留模块、写操作和正副本切换模块、以及工作模块;
内存数据正本模块,又称待读写内存数据的正本指针模块,简称正本指针,用于在该模块内进行待读写内存数据所有的增加、删除和修改的操作;
内存数据副本模块,又称内存数据的副本指针模块,简称副本指针,用于在该模块内进行内存数据的所有读取操作;
内存数据副本保留模块,又称内存数据副本的保留指针模块,简称保留指针,用于临时存放当前副本的指针,并保留一个正副本切换周期;
写操作和正副本切换模块包括写操作子模块和正副本切换子模块,写操作子模块用于负责在内存数据正本模块中按上述方法进行数据的增加、修改或删除操作;正副本切换子模块用于负责每隔一个周期将正本、副本和保留的数据进行更新同步;
工作模块即一般的工作线程,负责从内存数据副本模块中取出数据进行具体的业务逻辑功能实现。
2.根据权利要求1所述的基于正副本切换的多线程数据无锁读写系统,其特征在于:一种基于正副本切换的多线程数据无锁读写方法,包括如下步骤,
1)在程序初始化阶段,先一次性将现有数据写入内存数据正本模块,并拷贝一份至内存数据副本模块;
2)后续建立进行读操作、写操作和正副本切换操作的工作线程;其中写操作和正副本切换操作安排在相同且唯一的工作线程当中,循环执行;写操作和正副本切换操作,这两个操作按先后顺序执行,保证写操作和正副本切换操作无需加锁;读操作则安排在多个工作线程中循环执行,由于读操作实际是指针赋值,属于原子操作,无须进行加锁;
3)在写操作和正副本切换操作的工作线程中,规定一个正副本切换周期和一个写操作周期,其中切换操作周期的时长大于写操作周期;在一个切换操作周期内,每隔一个写操作周期进行一次正本数据更新操作;当一个切换操作周期过完后,进行一次正副本切换操作,更新内存数据副本模块和内存数据副本保留模块。
3.根据权利要求2所述的基于正副本切换的多线程数据无锁读写系统,其特征在于,所述步骤3)中所述的正副本切换流程,包括如下步骤:
3-1)清空保留指针;
判断保留指针是否为空,如果是则跳过,否则将保留指针的内存空间都释放掉;
3-2)更新接管保留指针;
将副本指针的值赋给保留指针,保留至下一次正、副本切换;
3-3)生成新的副本指针;
先将正本指针的内存空间拷贝一份至临时指针,然后将临时指针赋给副本指针。
4.根据权利要求3所述的基于正副本切换的多线程数据无锁读写系统,其特征在于,步骤3-2)中的指针赋值是原子操作,能够确保此次操作前后期间的读操作不会异常。
5.根据权利要求3所述的基于正副本切换的多线程数据无锁读写系统,其特征在于,步骤3-3)中的指针赋值是原子操作,能够保证此次操作前后期间的读操作读取到的数据是新副本或老副本其中之一,不会读取到异常数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811628744.2A CN109783243A (zh) | 2018-12-28 | 2018-12-28 | 一种基于正副本切换的多线程数据无锁读写方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811628744.2A CN109783243A (zh) | 2018-12-28 | 2018-12-28 | 一种基于正副本切换的多线程数据无锁读写方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109783243A true CN109783243A (zh) | 2019-05-21 |
Family
ID=66498863
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811628744.2A Pending CN109783243A (zh) | 2018-12-28 | 2018-12-28 | 一种基于正副本切换的多线程数据无锁读写方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109783243A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112860719A (zh) * | 2021-02-05 | 2021-05-28 | 北京百度网讯科技有限公司 | 数据处理方法、装置及电子设备 |
CN113656162A (zh) * | 2021-08-18 | 2021-11-16 | 恒生电子股份有限公司 | 资源的申请方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102508890A (zh) * | 2011-10-25 | 2012-06-20 | 无锡城市云计算中心有限公司 | 一种对象存储系统中对象一致性操作的方法 |
CN105468297A (zh) * | 2015-11-18 | 2016-04-06 | 临沂大学 | 一种云存储系统内主从设备数据快速同步的方法 |
CN106250212A (zh) * | 2016-07-29 | 2016-12-21 | 努比亚技术有限公司 | 资源访问方法及装置 |
-
2018
- 2018-12-28 CN CN201811628744.2A patent/CN109783243A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102508890A (zh) * | 2011-10-25 | 2012-06-20 | 无锡城市云计算中心有限公司 | 一种对象存储系统中对象一致性操作的方法 |
CN105468297A (zh) * | 2015-11-18 | 2016-04-06 | 临沂大学 | 一种云存储系统内主从设备数据快速同步的方法 |
CN106250212A (zh) * | 2016-07-29 | 2016-12-21 | 努比亚技术有限公司 | 资源访问方法及装置 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112860719A (zh) * | 2021-02-05 | 2021-05-28 | 北京百度网讯科技有限公司 | 数据处理方法、装置及电子设备 |
CN112860719B (zh) * | 2021-02-05 | 2023-09-29 | 北京百度网讯科技有限公司 | 数据处理方法、装置及电子设备 |
CN113656162A (zh) * | 2021-08-18 | 2021-11-16 | 恒生电子股份有限公司 | 资源的申请方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6889269B2 (en) | Non-blocking concurrent queues with direct node access by threads | |
US11132294B2 (en) | Real-time replicating garbage collection | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
US8776077B2 (en) | Method for multithreading an application using partitioning to allocate work to threads | |
US11620215B2 (en) | Multi-threaded pause-less replicating garbage collection | |
US20080263106A1 (en) | Database queuing and distributed computing | |
CN104424030B (zh) | 多进程操作共享内存的方法和装置 | |
CN108804545A (zh) | 分布式全局唯一id生成方法及设备 | |
US8527559B2 (en) | Garbage collector with concurrent flipping without read barrier and without verifying copying | |
US9141540B2 (en) | Garbage collection of interned strings | |
CN106294205A (zh) | 缓存数据处理方法及装置 | |
CN105095261A (zh) | 数据插入方法和装置 | |
CN104750720A (zh) | 多线程并发访问环境下高性能数据处理的实现 | |
CN109783243A (zh) | 一种基于正副本切换的多线程数据无锁读写方法 | |
KR101623631B1 (ko) | 캐시 메모리 구조 및 방법 | |
CN110825734B (zh) | 平衡树的并发更新方法及读写系统 | |
CN113377549B (zh) | 一种队列数据控制方法、系统及队列数据结构 | |
CN115203226A (zh) | 一种分布式表锁操作方法、装置以及设备 | |
Peluso et al. | GMU: genuine multiversion update-serializable partial data replication | |
EP3293636B1 (en) | Generic log memory scan | |
Moreno et al. | Memory reclamation methods for lock-free hash tries | |
CN109375990B (zh) | 一种基于原子操作的环形链表方法 | |
Ianni et al. | Towards a fully non-blocking share-everything PDES platform | |
Choi | Formal Verification of Chase-Lev Deque in Concurrent Separation Logic | |
US11625386B2 (en) | Fast skip list purge |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20190521 |