一種無(wú)鎖數(shù)據(jù)緩沖區(qū)及其使用方法
【專利摘要】本發(fā)明提供了一種無(wú)鎖數(shù)據(jù)緩沖區(qū)及其使用方法,屬于并行計(jì)算領(lǐng)域。所述無(wú)鎖數(shù)據(jù)緩沖區(qū)包括數(shù)據(jù)存儲(chǔ)區(qū)和數(shù)據(jù)管理區(qū);所述數(shù)據(jù)存儲(chǔ)區(qū)用于存儲(chǔ)數(shù)據(jù);所述數(shù)據(jù)管理區(qū)包括:指向緩沖區(qū)開(kāi)始處最小數(shù)據(jù)單元的指針、指向緩沖區(qū)結(jié)尾處最小數(shù)據(jù)單元的指針、緩沖區(qū)中所有最小數(shù)據(jù)單元的地址存儲(chǔ)數(shù)組、當(dāng)前被使用的最小數(shù)據(jù)單元在地址存儲(chǔ)數(shù)組中的位置、緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)和最小數(shù)據(jù)單元鏈表;所述指向緩沖區(qū)開(kāi)始處最小數(shù)據(jù)單元的指針用于指向緩沖區(qū)的第一個(gè)最小數(shù)據(jù)單元;所述指向緩沖區(qū)結(jié)尾處最小數(shù)據(jù)單元的指針用于指向緩沖區(qū)的最后一個(gè)最小數(shù)據(jù)單元;所述緩沖區(qū)中所有最小數(shù)據(jù)單元的地址存儲(chǔ)數(shù)組用于存儲(chǔ)緩沖區(qū)中所有最小數(shù)據(jù)單元的地址。
【專利說(shuō)明】一種無(wú)鎖數(shù)據(jù)緩沖區(qū)及其使用方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于并行計(jì)算領(lǐng)域,具體涉及一種無(wú)鎖數(shù)據(jù)緩沖區(qū)及其使用方法。
【背景技術(shù)】
[0002]在并行計(jì)算領(lǐng)域中,有很多是針對(duì)海量數(shù)據(jù)計(jì)算的并行算法,它的串行處理過(guò)程如下:(I)從文件中讀一次算法計(jì)算所需的數(shù)據(jù)集;(2)算法計(jì)算;(3)把當(dāng)前次計(jì)算結(jié)果寫(xiě)文件;(4)判斷是否還有計(jì)算數(shù)據(jù),有就跳去(I)繼續(xù)執(zhí)行,否則結(jié)束執(zhí)行。它的并行算法中,使用讀數(shù)據(jù)緩沖區(qū)來(lái)達(dá)到一定程度的1與計(jì)算重疊,及任何的計(jì)算線程每次的計(jì)算時(shí)間有自己決定,一定程度上減少了硬件資源的空閑時(shí)間;但在對(duì)數(shù)據(jù)緩沖區(qū)的操作時(shí)需要使用同步機(jī)制,以便保證數(shù)據(jù)的一致性。這種并行算法中,存在同步的消耗問(wèn)題。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的在于解決上述現(xiàn)有技術(shù)中存在的難題,提供一種無(wú)鎖數(shù)據(jù)緩沖區(qū)及其使用方法,它提供多個(gè)計(jì)算線程在無(wú)鎖狀態(tài)下,向無(wú)鎖數(shù)據(jù)緩沖區(qū)申請(qǐng)一次計(jì)算所需的數(shù)據(jù)集的機(jī)制,減少了多個(gè)線程數(shù)據(jù)請(qǐng)求時(shí)同步的消耗。
[0004]本發(fā)明是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的:
[0005]一種無(wú)鎖數(shù)據(jù)緩沖區(qū),包括數(shù)據(jù)存儲(chǔ)區(qū)和數(shù)據(jù)管理區(qū);
[0006]所述數(shù)據(jù)存儲(chǔ)區(qū)用于存儲(chǔ)數(shù)據(jù);
[0007]所述數(shù)據(jù)管理區(qū)包括:指向緩沖區(qū)開(kāi)始處最小數(shù)據(jù)單元的指針、指向緩沖區(qū)結(jié)尾處最小數(shù)據(jù)單元的指針、緩沖區(qū)中所有最小數(shù)據(jù)單元的地址存儲(chǔ)數(shù)組、當(dāng)前被使用的最小數(shù)據(jù)單元在地址存儲(chǔ)數(shù)組中的位置、緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)和最小數(shù)據(jù)單元鏈表;
[0008]所述指向緩沖區(qū)開(kāi)始處最小數(shù)據(jù)單元的指針用于指向緩沖區(qū)的第一個(gè)最小數(shù)據(jù)單元;
[0009]所述指向緩沖區(qū)結(jié)尾處最小數(shù)據(jù)單元的指針用于指向緩沖區(qū)的最后一個(gè)最小數(shù)據(jù)單元;
[0010]所述緩沖區(qū)中所有最小數(shù)據(jù)單元的地址存儲(chǔ)數(shù)組用于存儲(chǔ)緩沖區(qū)中所有最小數(shù)據(jù)單元的地址;
[0011]所述當(dāng)前被使用的最小數(shù)據(jù)單元在地址存儲(chǔ)數(shù)組中的位置用于存儲(chǔ)當(dāng)前被使用的最小數(shù)據(jù)單元在地址存儲(chǔ)數(shù)組中的位置;
[0012]所述緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)用于存儲(chǔ)緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)N;
[0013]所述緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)N是固定的。
[0014]所述最小數(shù)據(jù)單元鏈表包括N個(gè)最小數(shù)據(jù)單元,每個(gè)所述最小數(shù)據(jù)單元包括:指向數(shù)據(jù)的指針、最小數(shù)據(jù)單元狀態(tài)標(biāo)志和指向下一個(gè)最小數(shù)據(jù)單元的指針;
[0015]所述指向數(shù)據(jù)的指針用于指向該最小數(shù)據(jù)單元對(duì)應(yīng)的存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)區(qū)內(nèi)的數(shù)據(jù)集;
[0016]所述最小數(shù)據(jù)單元狀態(tài)標(biāo)志用于表示最小數(shù)據(jù)單元的狀態(tài),所述狀態(tài)為下面三種情況之一:最小數(shù)據(jù)單元正在使用、最小數(shù)據(jù)單元使用完、最小數(shù)據(jù)單元可以使用;
[0017]所述指向下一個(gè)最小數(shù)據(jù)單元的指針用于指向最小數(shù)據(jù)單元鏈表中與該最小數(shù)據(jù)單元相鄰的下一個(gè)最小數(shù)據(jù)單元。
[0018]每個(gè)所述最小數(shù)據(jù)單元通過(guò)所述指向數(shù)據(jù)的指針與所述數(shù)據(jù)存儲(chǔ)區(qū)內(nèi)的一個(gè)數(shù)據(jù)集對(duì)應(yīng)。
[0019]通過(guò)無(wú)鎖機(jī)制使得最小數(shù)據(jù)單元鏈表中的最小數(shù)據(jù)單元一次只被一個(gè)線程獲取并使用。
[0020]一種使用所述無(wú)鎖數(shù)據(jù)緩沖區(qū)的方法,包括:
[0021](I)創(chuàng)建兩個(gè)無(wú)鎖數(shù)據(jù)緩沖區(qū),給每個(gè)無(wú)鎖數(shù)據(jù)緩沖區(qū)內(nèi)的最小數(shù)據(jù)單元個(gè)數(shù)進(jìn)行賦值;
[0022](2)讀線程獲取一個(gè)空的無(wú)鎖數(shù)據(jù)緩沖區(qū),并把每次讀到的對(duì)應(yīng)最小數(shù)據(jù)單元的數(shù)據(jù)集放入到數(shù)據(jù)存儲(chǔ)區(qū)內(nèi),并將對(duì)應(yīng)該數(shù)據(jù)集的最小數(shù)據(jù)單元加入到最小數(shù)據(jù)單元鏈表中,直到數(shù)據(jù)讀取完或者直到當(dāng)前讀線程正在操作的無(wú)鎖數(shù)據(jù)緩沖區(qū)已滿,將所述最小數(shù)據(jù)單元狀態(tài)標(biāo)志設(shè)為最小數(shù)據(jù)單元可以使用;
[0023](3)計(jì)算線程獲取經(jīng)過(guò)步驟(2)處理的無(wú)鎖數(shù)據(jù)緩沖區(qū),并在無(wú)鎖狀態(tài)下,同時(shí)去該無(wú)鎖數(shù)據(jù)緩沖區(qū)中請(qǐng)求可用數(shù)據(jù),直到該無(wú)鎖數(shù)據(jù)緩沖區(qū)為空;
[0024](4)讀線程和計(jì)算線程交替互換使用兩個(gè)無(wú)鎖數(shù)據(jù)緩沖區(qū),直到數(shù)據(jù)計(jì)算完成。
[0025]與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:本發(fā)明解決了讀線程空閑狀態(tài),最大化了計(jì)算和1重疊;減少了多個(gè)線程請(qǐng)求數(shù)據(jù)時(shí)的同步開(kāi)銷。
【專利附圖】
【附圖說(shuō)明】
[0026]圖1示出本發(fā)明的一個(gè)實(shí)施例的數(shù)據(jù)結(jié)構(gòu)及其操作的方法集。
[0027]圖2示出用于實(shí)現(xiàn)圖1中的關(guān)鍵操作方法的實(shí)施例附圖。
[0028]圖3本發(fā)明無(wú)鎖數(shù)據(jù)緩沖區(qū)的結(jié)構(gòu)示意圖。
[0029]圖4本發(fā)明方法的步驟框圖。
【具體實(shí)施方式】
[0030]下面結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步詳細(xì)描述:
[0031]本發(fā)明提供了一種基于單個(gè)讀線程、多個(gè)計(jì)算線程的無(wú)鎖數(shù)據(jù)緩沖區(qū),通過(guò)在數(shù)據(jù)緩沖區(qū)中使用固定的最小數(shù)據(jù)單元個(gè)數(shù),減少了數(shù)據(jù)單元移動(dòng)或指向數(shù)據(jù)單元指針的移動(dòng)消耗;另外,通過(guò)“最小數(shù)據(jù)單元狀態(tài)”標(biāo)志,減少了獲取無(wú)鎖數(shù)據(jù)緩沖區(qū)中可被使用的最小數(shù)據(jù)單元的比較次數(shù)。
[0032]所述數(shù)據(jù)管理區(qū)的結(jié)構(gòu)如圖3所示,本發(fā)明的無(wú)鎖數(shù)據(jù)緩沖區(qū)包括N個(gè)最小數(shù)據(jù)單元301,數(shù)據(jù)管理區(qū)302和最小數(shù)據(jù)單元鏈表303。這些最小數(shù)據(jù)單元(一次算法計(jì)算所需的數(shù)據(jù)集可以一樣大也可以不一樣大,取決于每個(gè)“指向數(shù)據(jù)的指針”指向的數(shù)據(jù)大小))包含在管理它的數(shù)據(jù)結(jié)構(gòu)中,一一對(duì)應(yīng),即最小數(shù)據(jù)單元通過(guò)“指向數(shù)據(jù)的指針”與指向數(shù)據(jù)一一對(duì)應(yīng)。而這些管理數(shù)據(jù)結(jié)構(gòu)被鏈表數(shù)據(jù)結(jié)構(gòu)鏈接在一起(通過(guò)單向鏈表鏈接在一起),形成一個(gè)數(shù)據(jù)緩沖區(qū),再利用無(wú)鎖機(jī)制,對(duì)鏈表中的最小數(shù)據(jù)單元請(qǐng)求進(jìn)行一致性管理,此處一致性管理即指通過(guò)無(wú)鎖機(jī)制(即支持“比較-交換”的CPU原子指令操作)來(lái)使得鏈表中的最小數(shù)據(jù)單元一次只會(huì)被一個(gè)線程獲取并使用。
[0033]本發(fā)明允許多個(gè)計(jì)算線程向無(wú)鎖數(shù)據(jù)緩沖區(qū)同時(shí)申請(qǐng)最小數(shù)據(jù)單元(即只要多個(gè)計(jì)算線程都在需要數(shù)據(jù)時(shí)執(zhí)行獲取有用的最小數(shù)據(jù)單元201算法即可申請(qǐng)獲取最小數(shù)據(jù)單元),減少了多個(gè)線程數(shù)據(jù)請(qǐng)求時(shí)同步的消耗。但此緩沖區(qū)的操作有以下約定:
[0034](I)提供給多個(gè)計(jì)算線程使用的無(wú)鎖數(shù)據(jù)緩沖區(qū)大小是固定的,即不能對(duì)緩沖區(qū)進(jìn)行最小數(shù)據(jù)單元增加和減少的操作,也就是說(shuō)緩沖區(qū)中的最小數(shù)據(jù)單元個(gè)數(shù)不可以更改了,但是最小數(shù)據(jù)單元中管理的數(shù)據(jù),還是可以通過(guò)“指向數(shù)據(jù)的指針”來(lái)更改的;
[0035](2)讀線程操作時(shí),計(jì)算線程不能操作,反之亦然;這條規(guī)定要求使用此無(wú)鎖數(shù)據(jù)緩沖區(qū)需要為單個(gè)讀線程和多個(gè)計(jì)算線程各自提供一個(gè)數(shù)據(jù)緩沖區(qū),通過(guò)互斥鎖和條件變量控制相互的交替使用,來(lái)達(dá)到這兩個(gè)緩沖區(qū)數(shù)據(jù)的一致性,以便保證訪問(wèn)數(shù)據(jù)的一致性。
[0036]實(shí)施例通過(guò)單個(gè)讀數(shù)據(jù)線程、N個(gè)計(jì)算線程來(lái)展示了無(wú)鎖數(shù)據(jù)緩沖區(qū)。
[0037]圖1示出本發(fā)明的一個(gè)實(shí)施例的C++語(yǔ)言實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)及其操作的方法集;當(dāng)然,可以以各種語(yǔ)言來(lái)定義和重新實(shí)現(xiàn)方法集。數(shù)據(jù)結(jié)構(gòu)如圖3所示。
[0038]在圖1中,BEING_USED、USED_END、USEFUL3個(gè)值表示最小數(shù)據(jù)單元的狀態(tài),它們分別表示:最小數(shù)據(jù)單元正在使用、最小數(shù)據(jù)單元使用完、最小數(shù)單元可以使用。
[0039]Node數(shù)據(jù)結(jié)構(gòu)是管理最小數(shù)據(jù)單元的,其中_data指針指向的是最小數(shù)據(jù)單元;_beingFlag表示的是最小數(shù)據(jù)單元3種狀態(tài)中的一種;_serial WriteNum是為了標(biāo)示最小數(shù)據(jù)單元一定屬性的,它可以表示最小數(shù)據(jù)單元中的數(shù)據(jù)所屬讀文件的順序塊,也可表示讀線程放入最小數(shù)據(jù)單元中的數(shù)據(jù)的先后順序,它可以提供給特定算法計(jì)算時(shí)使用;_next指向下一個(gè)管理最小數(shù)據(jù)單元的數(shù)據(jù)結(jié)構(gòu)體。
[0040]PListRead類數(shù)據(jù)結(jié)構(gòu)中,head指向數(shù)據(jù)緩沖區(qū)鏈表頭;tail指向數(shù)據(jù)緩沖區(qū)鏈表尾部;higeArray是存放緩沖區(qū)鏈表中每個(gè)節(jié)點(diǎn)地址的數(shù)組,使用它可以提高鏈表操作的速度;_obj是擁有最小數(shù)據(jù)單元的實(shí)例,它會(huì)在最小數(shù)據(jù)單元不用時(shí),調(diào)用其擁有的freeNodeRes接口釋放掉最小數(shù)據(jù)單元占用的存儲(chǔ)空間;currNode (101)結(jié)合higeArray使用,表示最近一次已經(jīng)被使用或已經(jīng)使用完的最小數(shù)據(jù)單元在higeArray數(shù)組中的下標(biāo);count表示數(shù)據(jù)緩沖區(qū)鏈表中元素的個(gè)數(shù)。
[0041]由讀線程使用的操作如下:InsertAfterTail (void*value)實(shí)現(xiàn)往數(shù)據(jù)緩沖區(qū)鏈表尾部中增加一個(gè)最小數(shù)據(jù)單元,其value參數(shù)為指向最小數(shù)據(jù)單元的指針;InsertAfter(void*prev1us, void*value)在數(shù)據(jù)緩沖區(qū)鏈表元素prev1us后,插入一個(gè)一個(gè)最小數(shù)據(jù)單元,其value參數(shù)為指向最小數(shù)據(jù)單元的指針;Remove (constvoid*value)從數(shù)據(jù)緩沖區(qū)鏈表中移除元素,此元素中的最小數(shù)據(jù)單兀的起始地址是 value; SetHeadTail (void*headVal, void*tailVal)指定數(shù)據(jù)緩沖區(qū)鏈表的頭部元素是headVal,尾部元素是tailVal; SetHighPerformArray ()為已經(jīng)固定大小的數(shù)據(jù)緩沖區(qū)鏈表設(shè)置高效訪問(wèn)數(shù)組;SetFreeFunc (ExecFuncRType*ob j,FreeNodeResourcefunc = O)設(shè)置最小數(shù)據(jù)單元中資源釋放的對(duì)象obj及其它使用的操作func; SetCurrNodeToHeadO把數(shù)據(jù)緩沖區(qū)設(shè)置成準(zhǔn)備被使用;GetNodeCount O獲取數(shù)據(jù)緩沖區(qū)鏈表中元素的個(gè)數(shù),即最小數(shù)據(jù)單元的大?。籗etNodeUseful (Node*node,intserialNum)設(shè)置數(shù)據(jù)緩沖區(qū)鏈表中node元素中的最小數(shù)據(jù)單元可以使用,并設(shè)置最小數(shù)據(jù)單元的屬性為serialNum。
[0042]由計(jì)算線程使用的操作如下:GetUsefulNodeSafe O用于計(jì)算線程從數(shù)據(jù)緩沖區(qū)中獲取數(shù)據(jù),如圖2的201,它的無(wú)鎖獲取最小數(shù)據(jù)單元的流程是:(I)currNode(1l)原子加1,并賦給局部變量k(2011) ; (2)判斷當(dāng)前k是否超出數(shù)據(jù)緩沖區(qū)鏈表元素的個(gè)數(shù)(2012),是則表示數(shù)據(jù)緩沖區(qū)中沒(méi)有可用的最小數(shù)據(jù)單元,跳到(7)去執(zhí)行,否則繼續(xù)下一步執(zhí)行;(3)取出當(dāng)前k所指向的最小數(shù)據(jù)單元(2014) ; (4)判斷此最小數(shù)據(jù)單元是否可用(2015),是則繼續(xù)下一步執(zhí)行,否則跳到(7)去執(zhí)行;(6)返回可用的最小數(shù)據(jù)單元給計(jì)算線程使用(2016),并跳去(8)執(zhí)行;(7)返回O個(gè)最小數(shù)據(jù)單元(2013) ; (8)結(jié)束執(zhí)行。
[0043]SetNodeUsedEnd (Node*node, FreeNodeResourcefunc = O)的作用是設(shè)置節(jié)點(diǎn)使用完?duì)顟B(tài),并釋放相應(yīng)的資源,它針對(duì)的是每個(gè)計(jì)算函數(shù)已經(jīng)獲取的私有最小數(shù)據(jù)單元,所以可以不用任何的同步和原子操作即可。
[0044]IsBeingUsed(Node^node)可以便捷的查詢當(dāng)前最小數(shù)據(jù)單元node的狀態(tài),它提供如圖2(202)的能力,即對(duì)最小數(shù)據(jù)node提供原子操作查詢,高效。
[0045]結(jié)合以上分析,通過(guò)以下4步就可以操作無(wú)鎖數(shù)據(jù)緩沖區(qū):
[0046](I)創(chuàng)建2個(gè)無(wú)鎖數(shù)據(jù)緩沖區(qū)鏈表,給每個(gè)鏈表元素中管理的最小數(shù)據(jù)單元賦值;
[0047](2)讀線程獲取一個(gè)空的無(wú)鎖數(shù)據(jù)緩沖區(qū),并把每次讀到的,對(duì)應(yīng)最小數(shù)據(jù)單元的數(shù)據(jù)集,放入鏈表元素的最小數(shù)據(jù)單元中,直到數(shù)據(jù)讀取完或直到當(dāng)前讀線程正在操作的緩沖區(qū)已滿;一般情況下是填滿了讀線程正在操作的緩沖區(qū)的,但是如果數(shù)據(jù)已經(jīng)讀完了,還沒(méi)有填滿,那么也就假設(shè)滿了,它通過(guò)設(shè)置“最小數(shù)據(jù)單元狀態(tài)”標(biāo)志為可以被使用,而其它的為不可使用,來(lái)達(dá)到要求。
[0048](3)計(jì)算線程獲取一個(gè)滿的無(wú)鎖數(shù)據(jù)緩沖區(qū)(這個(gè)緩沖區(qū)是步驟(2)中讀滿的緩沖區(qū)通過(guò)互斥鎖和條件變量控制交給步驟(3)的緩沖區(qū)。如果緩沖區(qū)出現(xiàn)上面步驟(2)所說(shuō)的讀完了數(shù)據(jù)但沒(méi)有填滿的情況,步驟(3)也是可以正常處理的,因?yàn)樵谟?jì)算線程執(zhí)行獲取有用的最小數(shù)據(jù)單元201的最小數(shù)據(jù)單元可用否? 2015中會(huì)對(duì)“最小數(shù)據(jù)單元狀態(tài)”標(biāo)志進(jìn)行判斷,獲取可用被使用的數(shù)據(jù)),并可以在無(wú)鎖狀態(tài)下,同時(shí)去緩沖區(qū)(這個(gè)緩沖區(qū)指的是步驟(2)中讀滿的緩沖區(qū)通過(guò)控制和條件變量交給步驟(3)的緩沖區(qū))中請(qǐng)求可用數(shù)據(jù),一直等到當(dāng)前緩沖區(qū)(步驟(2)中讀滿的緩沖區(qū)通過(guò)互斥鎖和條件變量控制交給步驟(3)的緩沖區(qū),也即所有計(jì)算線程通過(guò)控制和條件變量從步驟(2)中得到的,當(dāng)前正在使用的緩沖區(qū))已空;
[0049](4)讀線程和計(jì)算線程緩沖區(qū)交替互換使用,直到數(shù)據(jù)計(jì)算完成。
[0050]如圖4所示,本發(fā)明方法的讀線程操作如下:
[0051](I)讀線程通過(guò)互斥鎖和條件變量的控制從2個(gè)無(wú)鎖緩沖區(qū)中獲取一個(gè)空數(shù)據(jù)的無(wú)鎖緩沖區(qū);
[0052](2)使用從O依次加I的“緩沖區(qū)中所有最小數(shù)據(jù)單元的地址存儲(chǔ)數(shù)組下標(biāo),獲得一個(gè)空的最小數(shù)據(jù)單元301;
[0053](3)把從各種媒介(內(nèi)存、文件等)中讀取數(shù)據(jù)到存放到“指向數(shù)據(jù)的指針”中,并把“最小數(shù)據(jù)單元狀態(tài)”標(biāo)志設(shè)置為可被使用;
[0054](4)判斷(2)中的下標(biāo)是否大于等于緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)或數(shù)據(jù)是否讀完(即緩沖區(qū)是否讀滿),如果否,則返回步驟(2),如果是,則轉(zhuǎn)入步驟(5);
[0055](5)通過(guò)互斥鎖和條件變量的控制把滿的無(wú)鎖數(shù)據(jù)緩沖區(qū)交給計(jì)算線程,并返回步驟⑴。
[0056]上述技術(shù)方案只是本發(fā)明的一種實(shí)施方式,對(duì)于本領(lǐng)域內(nèi)的技術(shù)人員而言,在本發(fā)明公開(kāi)了應(yīng)用方法和原理的基礎(chǔ)上,很容易做出各種類型的改進(jìn)或變形,而不僅限于本發(fā)明上述【具體實(shí)施方式】所描述的方法,因此前面描述的方式只是優(yōu)選的,而并不具有限制性的意義。
【權(quán)利要求】
1.一種無(wú)鎖數(shù)據(jù)緩沖區(qū),其特征在于:所述無(wú)鎖數(shù)據(jù)緩沖區(qū)包括數(shù)據(jù)存儲(chǔ)區(qū)和數(shù)據(jù)管理區(qū); 所述數(shù)據(jù)存儲(chǔ)區(qū)用于存儲(chǔ)數(shù)據(jù); 所述數(shù)據(jù)管理區(qū)包括:指向緩沖區(qū)開(kāi)始處最小數(shù)據(jù)單元的指針、指向緩沖區(qū)結(jié)尾處最小數(shù)據(jù)單元的指針、緩沖區(qū)中所有最小數(shù)據(jù)單元的地址存儲(chǔ)數(shù)組、當(dāng)前被使用的最小數(shù)據(jù)單元在地址存儲(chǔ)數(shù)組中的位置、緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)和最小數(shù)據(jù)單元鏈表; 所述指向緩沖區(qū)開(kāi)始處最小數(shù)據(jù)單元的指針用于指向緩沖區(qū)的第一個(gè)最小數(shù)據(jù)單元; 所述指向緩沖區(qū)結(jié)尾處最小數(shù)據(jù)單元的指針用于指向緩沖區(qū)的最后一個(gè)最小數(shù)據(jù)單元; 所述緩沖區(qū)中所有最小數(shù)據(jù)單元的地址存儲(chǔ)數(shù)組用于存儲(chǔ)緩沖區(qū)中所有最小數(shù)據(jù)單元的地址; 所述當(dāng)前被使用的最小數(shù)據(jù)單元在地址存儲(chǔ)數(shù)組中的位置用于存儲(chǔ)當(dāng)前被使用的最小數(shù)據(jù)單元在地址存儲(chǔ)數(shù)組中的位置; 所述緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)用于存儲(chǔ)緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)N; 所述緩沖區(qū)中最小數(shù)據(jù)單元個(gè)數(shù)N是固定的。
2.根據(jù)權(quán)利要求1所述的無(wú)鎖數(shù)據(jù)緩沖區(qū),其特征在于:所述最小數(shù)據(jù)單元鏈表包括N個(gè)最小數(shù)據(jù)單元,每個(gè)所述最小數(shù)據(jù)單元包括:指向數(shù)據(jù)的指針、最小數(shù)據(jù)單元狀態(tài)標(biāo)志和指向下一個(gè)最小數(shù)據(jù)單元的指針; 所述指向數(shù)據(jù)的指針用于指向該最小數(shù)據(jù)單元對(duì)應(yīng)的存儲(chǔ)在所述數(shù)據(jù)存儲(chǔ)區(qū)內(nèi)的數(shù)據(jù)集; 所述最小數(shù)據(jù)單元狀態(tài)標(biāo)志用于表示最小數(shù)據(jù)單元的狀態(tài),所述狀態(tài)為下面三種情況之一:最小數(shù)據(jù)單元正在使用、最小數(shù)據(jù)單元使用完、最小數(shù)據(jù)單元可以使用; 所述指向下一個(gè)最小數(shù)據(jù)單元的指針用于指向最小數(shù)據(jù)單元鏈表中與該最小數(shù)據(jù)單元相鄰的下一個(gè)最小數(shù)據(jù)單元。
3.根據(jù)權(quán)利要求2所述的無(wú)鎖數(shù)據(jù)緩沖區(qū),其特征在于:每個(gè)所述最小數(shù)據(jù)單元通過(guò)所述指向數(shù)據(jù)的指針與所述數(shù)據(jù)存儲(chǔ)區(qū)內(nèi)的一個(gè)數(shù)據(jù)集一一對(duì)應(yīng)。
4.根據(jù)權(quán)利要求3所述的無(wú)鎖數(shù)據(jù)緩沖區(qū),其特征在于:通過(guò)無(wú)鎖機(jī)制使得最小數(shù)據(jù)單元鏈表中的最小數(shù)據(jù)單元一次只被一個(gè)線程獲取并使用。
5.一種使用權(quán)利要求4所述無(wú)鎖數(shù)據(jù)緩沖區(qū)的方法,其特征在于:包括: (1)創(chuàng)建兩個(gè)無(wú)鎖數(shù)據(jù)緩沖區(qū),給每個(gè)無(wú)鎖數(shù)據(jù)緩沖區(qū)內(nèi)的最小數(shù)據(jù)單元個(gè)數(shù)進(jìn)行賦值; (2)讀線程獲取一個(gè)空的無(wú)鎖數(shù)據(jù)緩沖區(qū),并把每次讀到的對(duì)應(yīng)最小數(shù)據(jù)單元的數(shù)據(jù)集放入到數(shù)據(jù)存儲(chǔ)區(qū)內(nèi),并將對(duì)應(yīng)該數(shù)據(jù)集的最小數(shù)據(jù)單元加入到最小數(shù)據(jù)單元鏈表中,直到數(shù)據(jù)讀取完或者直到當(dāng)前讀線程正在操作的無(wú)鎖數(shù)據(jù)緩沖區(qū)已滿,將所述最小數(shù)據(jù)單元狀態(tài)標(biāo)志設(shè)為最小數(shù)單元可以使用; (3)計(jì)算線程獲取經(jīng)過(guò)步驟(2)處理的無(wú)鎖數(shù)據(jù)緩沖區(qū),并在無(wú)鎖狀態(tài)下,同時(shí)去該無(wú)鎖數(shù)據(jù)緩沖區(qū)中請(qǐng)求可用數(shù)據(jù),直到該無(wú)鎖數(shù)據(jù)緩沖區(qū)為空; (4)讀線程和計(jì)算線程交替互換使用兩個(gè)無(wú)鎖數(shù)據(jù)緩沖區(qū),直到數(shù)據(jù)計(jì)算完成。
【文檔編號(hào)】G06F1/32GK104424123SQ201310409758
【公開(kāi)日】2015年3月18日 申請(qǐng)日期:2013年9月10日 優(yōu)先權(quán)日:2013年9月10日
【發(fā)明者】洪承煜, 楊尚琴, 許自龍, 龐世明, 宋志翔, 陳科 申請(qǐng)人:中國(guó)石油化工股份有限公司, 中國(guó)石油化工股份有限公司石油物探技術(shù)研究院