CN114356589B - 多写入者多读取者的数据存储和读取方法、装置及设备 - Google Patents
多写入者多读取者的数据存储和读取方法、装置及设备 Download PDFInfo
- Publication number
- CN114356589B CN114356589B CN202111500107.9A CN202111500107A CN114356589B CN 114356589 B CN114356589 B CN 114356589B CN 202111500107 A CN202111500107 A CN 202111500107A CN 114356589 B CN114356589 B CN 114356589B
- Authority
- CN
- China
- Prior art keywords
- value
- data
- variable
- array
- read
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 51
- 238000013500 data storage Methods 0.000 title claims abstract description 23
- 238000012545 processing Methods 0.000 claims description 12
- 238000010586 diagram Methods 0.000 description 9
- 230000008569 process Effects 0.000 description 9
- 238000004891 communication Methods 0.000 description 8
- 238000004590 computer program Methods 0.000 description 6
- 230000003287 optical effect Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001953 sensory effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Landscapes
- Digital Magnetic Recording (AREA)
- Read Only Memory (AREA)
Abstract
本公开的实施例提供了一种多写入者多读取者的数据存储和读取方法、装置及设备。所述方法包括写入者线程获取数组中写入位置原子变量以及写入位置变量的值;设置写标志变量,所述写标志变量的值为写入位置原子变量的值;将所述写入位置原子变量的值增加预设的待存储数据的大小;若写标志变量的值与所述数组中数据写入位置变量的值相同,则比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入;反之,则不写入所述待存储数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小,读取者线程同理。以此方式,可以实现不加锁的情况下解决共享内存的方案中多个读取线程之间的数据竞争问题,进而提高资源利用率。
Description
技术领域
本公开涉及数据存储和读取领域,具体提供一种多写入者多读取者的数据存储和读取方法、装置及设备。
背景技术
现代计算机大都具备多个核心,为计算机开发的软件为了有效利用多个核心会使用多线程程序,在多线程程序中,不同线程间有传递数据的需求,传输数据方法如共享一段内存,每个线程想要操作共享内存时,需要提前申请锁,操作完内存后再释放锁,以此来保证同一时间内只有一个线程在操作共享内存,防止同一时间内有多个线程操作共享内存导致共享内存中的数据异常的问题。
然而,共享内存中申请锁和释放锁的操作,耗用系统性能,且影响数据传输效率。
发明内容
本公开提供了一种多写入者多读取者的数据存储和读取方法、装置及设备。
根据本公开的第一方面,提供了一种多写入者多读取者的数据存储和读取方法。该方法包括:写入者线程获取数组中写入位置原子变量以及写入位置变量的值;
设置写标志变量,所述写标志变量的值为写入位置原子变量的值;
将所述写入位置原子变量的值增加预设的待存储数据的大小;
若写标志变量的值与所述数组中数据写入位置变量的值相同,则获取数组剩余存储空间大小,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据;
若写标志变量的值与所述数组中数据写入位置变量的值不相同,则有其他写入者线程正在写入,不向所述数组写入所述待存储数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
其中,所述数据由读取者线程进行读取;
读取者线程获取数组中读取位置原子变量以及读取位置变量的值;
设置读标志变量,所述读标志变量的值为读取位置原子变量的值;
将所述读取位置变量的值增加预设的待读取数据的大小;
若读标志变量的值与所述数组中数据读取位置变量的值相同,则获取数组剩余读取空间大小,比较数组剩余读取空间大小与待读取数据大小,判断是否应当读取待读取数据;
若读标志变量的值与所述数组中数据读取位置变量的值不相同,则有其他读取者线程正在读取,不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
在第一方面的一些实现方式中,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据包括:
若数组剩余存储空间大于等于待存储数据大小,则基于所述数据写入位置变量所指的位置,向所述数组写入所述待存储数据;
若数组剩余存储空间小于待存储数据大小,则由写入者选择等待读取者读取一些数据后,再基于所述数据写入位置变量所指的位置,从所述数组写入所述待存储数据,或不向所述数组写入所述待写入数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
或,比较数组剩余读取空间大小与待读取数据大小,判断是否应当读取待读取数据包括:
若数组剩余读取空间大于等于待读取数据大小,则基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据;
若数组剩余读取空间小于待读取数据大小,则由读取者选择等待写入者写入一些数据后,再基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据,或不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
在第一方面的一些实现方式中,所述获取数组剩余存储空间大小包括:
获取所述数组中读取位置变量的值;
根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余存储空间;
或,所述获取数组剩余读取空间大小包括:
获取所述数组中写入位置变量的值;
根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余读取空间。
在第一方面的一些实现方式中,根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余存储空间包括:
若所述写入位置变量的值小于所述读取位置变量的值,则所述数组的剩余存储空间为读取位置变量的值减去所述写入位置变量的值再减一;
若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为所述数组的容量值与所述读取位置变量的值之和减去所述写入位置变量的值;
或,根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余读取空间包括:
若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为写入位置变量的值减去所述读取位置变量的值;
若所述写入位置变量的值小于所述读取位置变量的值,则所述剩余读取空间为所述数组的容量值与所述写入位置变量的值之和减去所述读取位置变量的值。
在第一方面的一些实现方式中,在写入者线程中,当所述数组写至尾部元素位置,且所述待存储数据未完全写入所述数组时,将所述待存储数据中未写入所述数组的部分从所述数组的头部元素位置进行写入,直到写入待存储数据大小的数据;
或,在读取者线程中,当所述数组读至尾部元素位置,且所述待读取数据未完全读取所述数组时,将所述待读取数据中未读取所述数组的部分从所述数组的头部元素位置进行读取,直到读取待读取数据大小的数据。
在第一方面的一些实现方式中,在写入者线程中,更新写入位置变量为写入完成后对应的元素位置;
或,在读取者线程中,更新读取位置变量为读取完成后对应的元素位置。
在第一方面的一些实现方式中,在写入者线程中,若写入位置变量的值加上待存储数据的大小大于数组大小,则将数值增加后的写入原子位置变量的值减去数组大小;
或,在读取者线程中,若读取位置变量的值加上待读取数据的大小大于数组大小,则将数值增加后的读取原子位置变量的值减去数组大小。
在第一方面的一些实现方式中,写入者根据待存储数据长度判断是否等待读取者读取一些数据后,再基于所述数据写入位置变量所指的位置,从所述数组写入所述待存储数据,或不向所述数组写入所述待写入数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
或,读取者根据待读取数据长度判断是否等待写入者写入一些数据后,再基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据,或不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
根据本公开的第二方面,提供了一种多写入者多读取者的数据存储和读取装置。该装置包括:写入者获取模块,用于使写入者线程获取数组中写入位置原子变量以及写入位置变量的值;
写入者赋值模块,用于设置写标志变量,所述写标志变量的值为写入位置原子变量的值;
写入者读取位置原子变量调整模块,用于将所述写入位置原子变量的值增加预设的待存储数据的大小;
写入者处理模块,用于若写标志变量的值与所述数组中数据写入位置变量的值相同,则获取数组剩余存储空间大小,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据;若写标志变量的值与所述数组中数据写入位置变量的值不相同,则有其他写入者线程正在写入,不向所述数组写入所述待存储数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
读取者获取模块,用于使读取者线程获取数组中读取位置原子变量以及读取位置变量的值;
读取者赋值模块,用于设置读标志变量,所述读标志变量的值为读取位置原子变量的值;
读取者读取位置原子变量调整模块,用于将所述读取位置变量的值增加预设的待读取数据的大小;
读取者处理模块,用于若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为写入位置变量的值减去所述读取位置变量的值;若读标志变量的值与所述数组中数据读取位置变量的值不相同,则有其他读取者线程正在读取,不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
根据本公开的第三方面,提供了一种电子设备。该电子设备包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其特征在于,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行上述的方法。
本公开根据读标志变量及写标志变量的值确定是否有其它线程正在读取或写入数据,并结合剩余存储或读取空间大小与待存储或读取数据大小判断是否可以读取或写入数据,来实现不加锁的情况下解决共享内存的方案中多个读取线程之间的数据竞争问题,进而节约了计算资源,提高资源利用率。
应当理解,发明内容部分中所描述的内容并非旨在限定本公开的实施例的关键或重要特征,亦非用于限制本公开的范围。本公开的其它特征将通过以下的描述变得容易理解。
附图说明
结合附图并参考以下详细说明,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。附图用于更好地理解本方案,不构成对本公开的限定在附图中,相同或相似的附图标记表示相同或相似的元素,其中:
图1示出了根据本公开的实施例的多写入者多读取者的数据存储和读取方法的流程图;
图2示出了根据本公开的实施例的写入者线程示意图;
图3示出了根据本公开的实施例的读取者线程示意图;
图4示出了根据本公开的实施例的多写入者多读取者的数据存储和读取装置的框图;
图5示出了用来实现本公开实施例的多写入者多读取者的数据存储和读取方法的电子设备的框图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的全部其他实施例,都属于本公开保护的范围。
本公开中,根据读标志变量及写标志变量的值确定是否有其它线程正在读取或写入数据,并结合剩余存储或读取空间大小与待存储或读取数据大小判断是否可以读取或写入数据,从而解决多线程读取和写入过程中存在的数据竞争问题。
需要说明的是,在执行图1所示的方法之前,需要先对用到的数据以及变量进行初始,具体可以定义数组为A,大小为n,可以定义写入位置变量为aW,值为0,可以定义读取位置变量为aR,值为0,可以定义写入位置原子变量为apW,值为0,可以定义读取位置原子变量为acR,值为0,可以定义写标志变量为tw,可以定义读标志变量为tr。
之后,基于定义的数组和变量,以写入X字节、读取I字节的数据为例,执行图1中的方法。
图1示出了根据本公开的实施例的多写入者多读取者的数据存储和读取方法的流程图。
如图1所示,所述多写入者多读取者的数据存储和读取方法100包括:
S101:写入者线程获取数组中写入位置原子变量以及写入位置变量的值;
S102:设置写标志变量,所述写标志变量的值为写入位置原子变量的值;
S103:将所述写入位置原子变量的值增加预设的待存储数据的大小;
S104:若写标志变量的值与所述数组中数据写入位置变量的值相同,则获取数组剩余存储空间大小,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据;
S105:若写标志变量的值与所述数组中数据写入位置变量的值不相同,则有其他写入者线程正在写入,不向所述数组写入所述待存储数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
S106:读取者线程获取数组中读取位置原子变量以及读取位置变量的值;
S107:设置读标志变量,所述读标志变量的值为读取位置原子变量的值;
S108:将所述读取位置变量的值增加预设的待读取数据的大小;
S109:若读标志变量的值与所述数组中数据读取位置变量的值相同,则获取数组剩余读取空间大小,比较数组剩余读取空间大小与待读取数据大小,判断是否应当读取待读取数据;
S110:若读标志变量的值与所述数组中数据读取位置变量的值不相同,则有其他读取者线程正在读取,不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
可以理解的是,步骤S104与S105根据tw值与aW值的比对结果选择性执行,同理,步骤S109与S110根据tr值与aR值的比对结果选择性执行。
还可以理解的是,所述待存储数据与待读取数据有最小单位字节,待存储数据与待读取数据的最小单位字节相同,且各写入线程或读取线程中待存储数据与待读取数据的字节数均为最小单位字节的整数倍。例如,最小单位字节为5,那么,待存储数据与待读取数据字节数只能是5的倍数。且每个完整内容都必须在最小单位字节内写完或读完,如某一写入者写入10字节的待存储数据,那么,其包含2个均为5字节的完整内容,在读取者读取时,若待读取数据为5字节,可以只读取其中1个完整内容,若待读取数据为15字节,那么在读取完上述2个完整内容的基础上,还需要再读取其它生产者写入的1个完整内容。可以看出,最小单位字节可以避免写入线程与读取线程出现混乱。
为了便于理解,以各值均为初始值为例,在此分析有其它写入者写入和没有其它写入者写入的两种情况如下:
当没有其它写入者正在写入时,在步骤S101中,写入位置原子变量apW的值与写入位置变量aW的值均为0;
在步骤S102中,设置写标志变量tw的值为写入位置原子变量apW的值,即tw=0;
在步骤S103中,使apW=apW+X,此时可以看出,apW的值发生了变化;
tw=aW=0,则执行步骤S104,即获取数组剩余存储空间大小,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据。
当有其它写入者正在写入时,在步骤S101中,aW=0,由于在其它写入线程的步骤S103中,apW值被其它写入者更改,即其它写入者写入X其它字节的数据,因此,此时apW=apW+X其它=0+X其它=X其它;
在步骤S102中,tw=X其它;
在步骤S103中,使apW=X其它+X;
由于t=X其它≠aW,因此判断有其它写入者正在写入,因此停止写入,并使apW=X其它+X-X=X其它,即apW复原。
从上述分析可以看出,只要有其它写入者向数组内写入数据,那么写入位置原子变量apW的值就会发生变化,进而引起写标志变量tw的值发生变化,而待写入者的写入位置变量aW的值还未发生变化,所以可以根据写入位置原子变量的值的变化,即比对写标志变量tw的值与写入位置变量aW的值,判断是否有其它写入者正在写入。进而执行S104或S105,以实现在存在多写入线程的情况下,通过无锁解决数据竞争问题。
需要说明的是,写入位置变量aW的含义为从该数据位置开始进行写入,而写入位置原子变量apW的含义为写入结束时位于该数据位置。
在步骤S102和S103中,改变写位置原子变量apW的值及为写标志变量tw赋值的过程可以用tw=atomic_add(apW,X)-X来表示。
同理,比对读标志变量tr的值与读取位置变量aR的值,判断是否有其它读取者正在读取,以实现在存在多读取线程的情况下,通过无锁解决数据竞争问题。
读取位置变量aR的含义为从该数据位置开始进行读取,而读取位置原子变量acR的含义为读取结束时位于该数据位置。
在步骤S107和S108中,改变读位置原子变量acR的值及为读标志变量tr赋值的过程可以用tr=atomic_add(acR,I)-I来表示。
还需要说明的是,写入者可以获取写入位置原子变量apW和写入位置变量aW,但是读取者只需获取写入位置变量aW,而不获取写入位置原子变量apW,这是因为,对于读取者而言,只需要得知写入位置变量,从而获取剩余读取空间即可,写入者获取写入位置原子变量apW是为了确认当前是否有其它写入者写入,避免写入者线程之间的竞争,而读取者无需得知写入者线程间的竞争情况。同理,写入者只需获取读取位置变量aR,而无需获取读取位置原子变量acR。
在步骤S104中,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据包括:
若数组剩余存储空间大于等于待存储数据大小,则基于所述数据写入位置变量所指的位置,向所述数组写入所述待存储数据;
若数组剩余存储空间小于待存储数据大小,则由写入者选择等待读取者读取一些数据后,再基于所述数据写入位置变量所指的位置,从所述数组写入所述待存储数据,或不向所述数组写入所述待写入数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小。
根据本公开的实施例,若剩余存储空间大于或等于待存储数据所占的空间,说明剩余存储空间足够完整写入所述待存储数据,则基于写入位置变量所指的位置,向数组中写入所述待存储数据即可。
若数组剩余存储空间小于待存储数据大小,说明剩余存储空间不足以写入所述待存储数据,此时写入者可以根据具体情况灵活选择是否等待剩余存储空间增大后再写入,可以理解的是,当写入者等待时,由于写入位置变量apW改变,可以避免其它写入者写入,以此保证当前写入者优先写入。具体的,可以进一步设置写入者等待时间,若超过写入者等待时间,则结束写入者线程。
所述剩余存储空间用RESTw表示。
同理,对于读取者线程,在步骤S109中,比较数组剩余读取空间大小与待读取数据大小,判断是否应当读取待读取数据包括:
若数组剩余读取空间大于等于待读取数据大小,则基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据;
若数组剩余读取空间小于待读取数据大小,则由读取者选择等待写入者写入一些数据后,再基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据,或不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
所述剩余读取空间用RESTr表示。
在一些实施例中,所述获取数组剩余存储空间大小包括:
获取所述数组中读取位置变量的值;
根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余存储空间。
根据本公开的实施例,剩余存储空间为可以写入数据的空间,而写入者向数组内自写入位置变量aW的位置按顺序依次写入数据,读取者从数组内自读取位置变量aR的位置按顺序依次读取数据,因此,根据写入位置变量aW与读取位置变量aR的位置可以获取数组内未被数据填充的空间,再进一步计算出数组剩余存储空间。
同理,对于读取者线程,所述获取数组剩余读取空间大小包括:
获取所述数组中写入位置变量的值;
根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余读取空间。
在一些实施例中,根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余存储空间包括:
若所述写入位置变量的值小于所述读取位置变量的值,则所述数组的剩余存储空间为读取位置变量的值减去所述写入位置变量的值再减一;
若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为所述数组的容量值与所述读取位置变量的值之和减去所述写入位置变量的值。
即若aW<aR,则RESTw=aR-aW-1;若aW>aR,则RESTw=n+aR-aW
或,根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余读取空间包括:
若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为写入位置变量的值减去所述读取位置变量的值;
若所述写入位置变量的值小于所述读取位置变量的值,则所述剩余读取空间为所述数组的容量值与所述写入位置变量的值之和减去所述读取位置变量的值。
即若aW>aR,则RSETr=aW-aR,若aW<aR,则RESTr=n+aW-aR。
在一些实施例中,还包括:在写入者线程中,当所述数组写至尾部元素位置,且所述待存储数据未完全写入所述数组时,将所述待存储数据中未写入所述数组的部分从所述数组的头部元素位置进行写入,直到写入待存储数据大小的数据;
为了使写入可以循环,该数组可以是环形数组,因此基于数据写入位置变量aW所指的位置,向数组写入预设的待存储数据的过程中,可以将待存储数据从数组的写入位置变量aW所指的位置按顺序写入,若写至数组尾部,则从数组头部继续写,直到写至X字节数据。
计算tmpw=aW+X,若tmpw<n,则说明待读取的数据无法读至数组尾部,将aW的值更新为tmpw,若tmpw≥n,则说明待存储的数据能够写至数组尾部,将aW的值更新为tmpw-n,以用于在数组n的大小范围内表示aW的值。
同理,在读取者线程中,当所述数组读至尾部元素位置,且所述待读取数据未完全读取所述数组时,将所述待读取数据中未读取所述数组的部分从所述数组的头部元素位置进行读取,直到读取待读取数据大小的数据。
在一些实施例中,在写入者线程中,更新写入位置变量为写入完成后对应的元素位置;
可以理解的是,在初始时,写入位置变量aW与写入位置原子变量apW的值相同,因此,写入结束时,二者值也应当相同,以便于下一写入者线程写入新的数据。
同理,在读取者线程中,更新读取位置变量为读取完成后对应的元素位置。
在一些实施例中,在写入者线程中,若写入位置变量的值加上待存储数据的大小大于数组大小,则将数值增加后的写入原子位置变量的值减去数组大小。
即当tmpw>n时,执行atomic_sub(apW,n),以用于在数组n的大小范围内表示apW变化后的值。
同理,在读取者线程中,若读取位置变量的值加上待读取数据的大小大于数组大小,则将数值增加后的读取原子位置变量的值减去数组大小。
即当tmpr>n时,执行atomic_sub(acR,n),以用于在数组n的大小范围内表示acR变化后的值。
在一些实施例中,写入者根据待存储数据长度判断是否等待读取者读取一些数据后,再基于所述数据写入位置变量所指的位置,从所述数组写入所述待存储数据,或不向所述数组写入所述待写入数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小。
根据本公开的实施例,写入者根据待存储数据长度判断是否等待,具体的,待存储数据长度较长,则直接结束写入线程,待存储数据长度较短,则等待。这是由于,若待存储数据长度较长,直接结束写入线程,使其它待存储数据较短的写入线程可以写入,有利于提高数据存储效率。
同理,在读取者线程中,读取者根据待读取数据长度判断是否等待写入者写入一些数据后,再基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据,或不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
为了更加清晰的描述数据存储的过程,在一些实施例中,上述S101-S105的过程,还可以如图2的写入者线程示意图所示。
为了更加清晰的描述数据读取的过程,在一些实施例中,上述S106-S110的过程,还可以如图3的读取者线程示意图所示。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本公开并不受所描述的动作顺序的限制,因为依据本公开,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本公开所必须的。
以上是关于方法实施例的介绍,以下通过装置实施例,对本公开所述方案进行进一步说明。
图4示出了根据本公开的实施例的多写入者多读取者的数据存储和读取装置的框图。
如图4所示,装置400包括:
写入者获取模块401,用于使写入者线程获取数组中写入位置原子变量以及写入位置变量的值;
写入者赋值模块402,用于设置写标志变量,所述写标志变量的值为写入位置原子变量的值;
写入者读取位置原子变量调整模块403,用于将所述写入位置原子变量的值增加预设的待存储数据的大小;
写入者处理模块404,用于若写标志变量的值与所述数组中数据写入位置变量的值相同,则获取数组剩余存储空间大小,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据;若写标志变量的值与所述数组中数据写入位置变量的值不相同,则有其他写入者线程正在写入,不向所述数组写入所述待存储数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
读取者获取模块405,用于使读取者线程获取数组中读取位置原子变量以及读取位置变量的值;
读取者赋值模块406,用于设置读标志变量,所述读标志变量的值为读取位置原子变量的值;
读取者读取位置原子变量调整模块407,用于将所述读取位置变量的值增加预设的待读取数据的大小;
读取者处理模块408,用于若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为写入位置变量的值减去所述读取位置变量的值;若读标志变量的值与所述数组中数据读取位置变量的值不相同,则有其他读取者线程正在读取,不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,所述描述的模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本公开的技术方案中,所涉及的用户个人信息的获取,存储和应用等,均符合相关法律法规的规定,且不违背公序良俗。
根据本公开的实施例,本公开还提供了一种电子设备,所述电子设备包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其特征在于,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行所述的方法100。
图5示出了可以用来实施本公开的实施例的电子设备500的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
设备500包括计算单元501,其可以根据存储在只读存储器(ROM)502中的计算机程序或者从存储单元508加载到随机访问存储器(RAM)503中的计算机程序,来执行各种适当的动作和处理。在RAM 503中,还可存储设备500操作所需的各种程序和数据。计算单元501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O)接口505也连接至总线504。
设备500中的多个部件连接至I/O接口505,包括:输入单元506,例如键盘、鼠标等;输出单元507,例如各种类型的显示器、扬声器等;存储单元508,例如磁盘、光盘等;以及通信单元509,例如网卡、调制解调器、无线通信收发机等。通信单元509允许设备500通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
计算单元501可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元501的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元501执行上文所描述的各个方法和处理,例如方法100。例如,在一些实施例中,方法100可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元508。在一些实施例中,计算机程序的部分或者全部可以经由ROM 502和/或通信单元509而被载入和/或安装到设备500上。当计算机程序加载到RAM503并由计算单元501执行时,可以执行上文描述的方法100的一个或多个步骤。备选地,在其他实施例中,计算单元501可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行方法100。
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、芯片上系统的系统(SOC)、负载可编程逻辑设备(CPLD)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,也可以为分布式系统的服务器,或者是结合了区块链的服务器。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。
Claims (10)
1.一种多写入者多读取者的数据存储和读取方法,其特征在于,包括:
写入者线程获取数组中写入位置原子变量以及写入位置变量的值;
设置写标志变量,所述写标志变量的值为写入位置原子变量的值;
将所述写入位置原子变量的值增加预设的待存储数据的大小;
若写标志变量的值与所述数组中数据写入位置变量的值相同,则获取数组剩余存储空间大小,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据;
若写标志变量的值与所述数组中数据写入位置变量的值不相同,则有其他写入者线程正在写入,不向所述数组写入所述待存储数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
其中,所述数据由读取者线程进行读取;
读取者线程获取数组中读取位置原子变量以及读取位置变量的值;
设置读标志变量,所述读标志变量的值为读取位置原子变量的值;
将所述读取位置变量的值增加预设的待读取数据的大小;
若读标志变量的值与所述数组中数据读取位置变量的值相同,则获取数组剩余读取空间大小,比较数组剩余读取空间大小与待读取数据大小,判断是否应当读取待读取数据;
若读标志变量的值与所述数组中数据读取位置变量的值不相同,则有其他读取者线程正在读取,不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
2.如权利要求1所述的多写入者多读取者的数据存储和读取方法,其特征在于,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据包括:
若数组剩余存储空间大于等于待存储数据大小,则基于所述数据写入位置变量所指的位置,向所述数组写入所述待存储数据;
若数组剩余存储空间小于待存储数据大小,则由写入者选择等待读取者读取一些数据后,再基于所述数据写入位置变量所指的位置,从所述数组写入所述待存储数据,或不向所述数组写入所述待写入数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
或,比较数组剩余读取空间大小与待读取数据大小,判断是否应当读取待读取数据包括:
若数组剩余读取空间大于等于待读取数据大小,则基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据;
若数组剩余读取空间小于待读取数据大小,则由读取者选择等待写入者写入一些数据后,再基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据,或不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
3.如权利要求1所述的多写入者多读取者的数据存储和读取方法,其特征在于,所述获取数组剩余存储空间大小包括:
获取所述数组中读取位置变量的值;
根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余存储空间;
或,所述获取数组剩余读取空间大小包括:
获取所述数组中写入位置变量的值;
根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余读取空间。
4.如权利要求3所述的多写入者多读取者的数据存储和读取方法,其特征在于,根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余存储空间包括:
若所述写入位置变量的值小于所述读取位置变量的值,则所述数组的剩余存储空间为读取位置变量的值减去所述写入位置变量的值再减一;
若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为所述数组的容量值与所述读取位置变量的值之和减去所述写入位置变量的值;
或,根据所述读取位置变量的值和所述写入位置变量的值确定所述数组的剩余读取空间包括:
若所述写入位置变量的值大于所述读取位置变量的值,则所述剩余读取空间为写入位置变量的值减去所述读取位置变量的值;
若所述写入位置变量的值小于所述读取位置变量的值,则所述剩余读取空间为所述数组的容量值与所述写入位置变量的值之和减去所述读取位置变量的值。
5.如权利要求1所述的多写入者多读取者的数据存储和读取方法,其特征在于,还包括:
在写入者线程中,当所述数组写至尾部元素位置,且所述待存储数据未完全写入所述数组时,将所述待存储数据中未写入所述数组的部分从所述数组的头部元素位置进行写入,直到写入待存储数据大小的数据;
或,在读取者线程中,当所述数组读至尾部元素位置,且所述待读取数据未完全读取所述数组时,将所述待读取数据中未读取所述数组的部分从所述数组的头部元素位置进行读取,直到读取待读取数据大小的数据。
6.如权利要求5所述的多写入者多读取者的数据存储和读取方法,其特征在于,
在写入者线程中,更新写入位置变量为写入完成后对应的元素位置;
或,在读取者线程中,更新读取位置变量为读取完成后对应的元素位置。
7.如权利要求5所述的多写入者多读取者的数据存储和读取方法,其特征在于,
在写入者线程中,若写入位置变量的值加上待存储数据的大小大于数组大小,则将数值增加后的写入原子位置变量的值减去数组大小;
或,在读取者线程中,若读取位置变量的值加上待读取数据的大小大于数组大小,则将数值增加后的读取原子位置变量的值减去数组大小。
8.如权利要求2所述的多写入者多读取者的数据存储和读取方法,其特征在于,
写入者根据待存储数据长度判断是否等待读取者读取一些数据后,再基于所述数据写入位置变量所指的位置,从所述数组写入所述待存储数据,或不向所述数组写入所述待写入数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
或,读取者根据待读取数据长度判断是否等待写入者写入一些数据后,再基于所述数据读取位置变量所指的位置,从所述数组读取所述待读取数据,或不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
9.一种多写入者多读取者的数据存储和读取装置,其特征在于,包括
写入者获取模块,用于使写入者线程获取数组中写入位置原子变量以及写入位置变量的值;
写入者赋值模块,用于设置写标志变量,所述写标志变量的值为写入位置原子变量的值;
写入者读取位置原子变量调整模块,用于将所述写入位置原子变量的值增加预设的待存储数据的大小;
写入者处理模块,用于若写标志变量的值与所述数组中数据写入位置变量的值相同,则获取数组剩余存储空间大小,比较数组剩余存储空间大小与待存储数据大小,判断是否应当写入待存储数据;若写标志变量的值与所述数组中数据写入位置变量的值不相同,则有其他写入者线程正在写入,不向所述数组写入所述待存储数据,并将数值增加后的写入原子位置变量的值减去预设的待存储数据的大小;
读取者获取模块,用于使读取者线程获取数组中读取位置原子变量以及读取位置变量的值;
读取者赋值模块,用于设置读标志变量,所述读标志变量的值为读取位置原子变量的值;
读取者读取位置原子变量调整模块,用于将所述读取位置变量的值增加预设的待读取数据的大小;
读取者处理模块,用于若所述写入位置变量的值大于所述读取位置变量的值,则剩余读取空间为写入位置变量的值减去所述读取位置变量的值;若读标志变量的值与所述数组中数据读取位置变量的值不相同,则有其他读取者线程正在读取,不从所述数组读取所述待读取数据,并将数值增加后的读取原子位置变量的值减去预设的待读取数据的大小。
10.一种电子设备,其特征在于,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其特征在于,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-8中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111500107.9A CN114356589B (zh) | 2021-12-09 | 2021-12-09 | 多写入者多读取者的数据存储和读取方法、装置及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111500107.9A CN114356589B (zh) | 2021-12-09 | 2021-12-09 | 多写入者多读取者的数据存储和读取方法、装置及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114356589A CN114356589A (zh) | 2022-04-15 |
CN114356589B true CN114356589B (zh) | 2024-04-12 |
Family
ID=81096885
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111500107.9A Active CN114356589B (zh) | 2021-12-09 | 2021-12-09 | 多写入者多读取者的数据存储和读取方法、装置及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114356589B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110287044A (zh) * | 2019-07-02 | 2019-09-27 | 广州虎牙科技有限公司 | 无锁共享内存处理方法、装置、电子设备及可读存储介质 |
CN113377295A (zh) * | 2021-08-13 | 2021-09-10 | 北京华云安信息技术有限公司 | 多生产者单消费者的数据存储和读取方法、装置、设备 |
CN113672406A (zh) * | 2021-08-24 | 2021-11-19 | 北京天融信网络安全技术有限公司 | 数据传输处理方法、装置、电子设备及存储介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9207997B2 (en) * | 2007-08-09 | 2015-12-08 | Novell, Inc. | Multithreaded lock management |
US8495311B2 (en) * | 2009-06-25 | 2013-07-23 | International Business Machines Corporation | Updating shared variables atomically |
-
2021
- 2021-12-09 CN CN202111500107.9A patent/CN114356589B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110287044A (zh) * | 2019-07-02 | 2019-09-27 | 广州虎牙科技有限公司 | 无锁共享内存处理方法、装置、电子设备及可读存储介质 |
CN113377295A (zh) * | 2021-08-13 | 2021-09-10 | 北京华云安信息技术有限公司 | 多生产者单消费者的数据存储和读取方法、装置、设备 |
CN113672406A (zh) * | 2021-08-24 | 2021-11-19 | 北京天融信网络安全技术有限公司 | 数据传输处理方法、装置、电子设备及存储介质 |
Non-Patent Citations (1)
Title |
---|
一种检测竞争并自调节的动态读写锁;张恒;陈海波;;小型微型计算机系统;20160915(09);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN114356589A (zh) | 2022-04-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113641457B (zh) | 容器创建方法、装置、设备、介质及程序产品 | |
CN113010325B (zh) | 一种读写锁的实现方法、装置及电子设备 | |
CN110851276A (zh) | 一种业务请求处理方法、装置、服务器和存储介质 | |
CN117236236B (zh) | 一种芯片设计数据管理方法、装置、电子设备及存储介质 | |
CN114356589B (zh) | 多写入者多读取者的数据存储和读取方法、装置及设备 | |
CN113377295B (zh) | 多生产者单消费者的数据存储和读取方法、装置、设备 | |
CN115951845B (zh) | 一种磁盘管理方法、装置、设备及存储介质 | |
US8707449B2 (en) | Acquiring access to a token controlled system resource | |
CN115878333A (zh) | 进程组间的一致性判断方法、装置及设备 | |
CN111261206B (zh) | 一种读写方法、装置和电子设备及可读存储介质 | |
CN114064301A (zh) | 单写入者多读取者的数据存储和读取方法、装置及设备 | |
CN115599307B (zh) | 数据存取方法、装置、电子设备、存储介质 | |
CN116756063B (zh) | 数据传输电路、方法及系统级芯片 | |
CN114217872B (zh) | 应用程序启动方法、装置、电子设备及存储介质 | |
US20220353874A1 (en) | Method and Apparatus for Maximizing a Number of Connections That Can Be Executed from a Mobile Application | |
CN113419871B (zh) | 基于同步槽的对象处理方法及相关产品 | |
CN113434149B (zh) | 应用程序生成和加载方法、装置和介质 | |
CN112084297B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN110955612B (zh) | 一种数据缓存方法及相关装置 | |
CN116680080A (zh) | 一种内存管理方法、装置、电子设备和存储介质 | |
CN113918307A (zh) | 一种任务处理方法、装置、设备及介质 | |
CN117873694A (zh) | 堆空间分配方法、装置、电子设备和存储介质 | |
CN114896075A (zh) | 图像重建方法、装置、电子设备及存储介质 | |
CN117707475A (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN117762823A (zh) | 块设备访问请求处理方法、装置及设备 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |