隊(duì)列的訪問方法及裝置制造方法
【專利摘要】本發(fā)明公開了一種隊(duì)列的訪問方法及裝置,屬于數(shù)據(jù)訪問【技術(shù)領(lǐng)域】。包括:創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn);獲取隊(duì)尾指針變量的值,判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空;若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則確定隊(duì)尾指針變量的值被更新,獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。本發(fā)明當(dāng)隊(duì)尾指針變量的值因并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)列操作,從而在不對(duì)隊(duì)列加鎖的情況下實(shí)現(xiàn)隊(duì)列的并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
【專利說明】隊(duì)列的訪問方法及裝置
【技術(shù)領(lǐng)域】
[0001 ] 本發(fā)明涉及數(shù)據(jù)訪問【技術(shù)領(lǐng)域】,特別涉及一種隊(duì)列的訪問方法及裝置。
【背景技術(shù)】
[0002]在進(jìn)行數(shù)據(jù)訪問技術(shù)的過程中,隊(duì)列作為一種數(shù)據(jù)結(jié)構(gòu),由于其FIFO (FirstInput First Output,先進(jìn)先出)的特性,被應(yīng)用于許多場合中,如算法的設(shè)計(jì)等。其中,在對(duì)隊(duì)列進(jìn)行訪問時(shí),為了提高資源利用率及程序運(yùn)行的速度,多數(shù)情況下程序在邏輯意義上被分割為數(shù)個(gè)線程,采用多線程并發(fā)機(jī)制,通過多線程對(duì)隊(duì)列進(jìn)行訪問。
[0003]相關(guān)技術(shù)中提供了一種隊(duì)列的訪問方法,在該方法中,當(dāng)線程A需要訪問隊(duì)列時(shí),會(huì)先對(duì)該隊(duì)列加鎖,線程A直到訪問隊(duì)列結(jié)束后,才會(huì)將鎖進(jìn)行解除。按照上述訪問方式,線程A在訪問隊(duì)列的過程中,若又到來了一個(gè)新的線程B需要對(duì)隊(duì)列進(jìn)行訪問,由于鎖并未解除,此時(shí)線程B不能對(duì)隊(duì)列進(jìn)行訪問,也就不能對(duì)隊(duì)列中相關(guān)變量進(jìn)行修改。
[0004]在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn)相關(guān)技術(shù)至少存在以下問題:
[0005]在使用加鎖的方法實(shí)現(xiàn)多個(gè)線程對(duì)隊(duì)列進(jìn)行訪問時(shí),一個(gè)線程訪問隊(duì)列,對(duì)該隊(duì)列加鎖,若另一個(gè)線程需要對(duì)隊(duì)列進(jìn)行訪問,由于該隊(duì)列已經(jīng)加鎖,此時(shí)該線程會(huì)由運(yùn)行狀態(tài)變?yōu)榈却隣顟B(tài),并進(jìn)行上下文切換。而進(jìn)行上下文切換的過程需要占用的資源較多,且耗費(fèi)時(shí)間較長。另外,占用隊(duì)列的線程若未及時(shí)解鎖,可能會(huì)造成其它需要訪問該隊(duì)列的線程等待較長時(shí)間,因此,通過加鎖的方法實(shí)現(xiàn)隊(duì)列的訪問時(shí),效率不高。
【發(fā)明內(nèi)容】
[0006]為了解決現(xiàn)有技術(shù)的問題,本發(fā)明實(shí)施例提供了 一種隊(duì)列的訪問方法及裝置。所述技術(shù)方案如下:
[0007]一方面,提供了一種隊(duì)列的訪問方法,所述方法包括:
[0008]創(chuàng)建待加入所述隊(duì)列的第二節(jié)點(diǎn),所述第二節(jié)點(diǎn)包括值為空的指針變量;
[0009]獲取所述隊(duì)尾指針變量的值,并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0010]若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則確定所述隊(duì)尾指針變量的值被更新,獲取所述隊(duì)尾指針變量更新后的值,直至判斷所述隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將所述第二節(jié)點(diǎn)加入所述隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向所述第二節(jié)點(diǎn)。
[0011]另一方面,提供了一種隊(duì)列的訪問裝置,所述裝置包括:
[0012]創(chuàng)建模塊,用于創(chuàng)建待加入所述隊(duì)列的第二節(jié)點(diǎn),所述第二節(jié)點(diǎn)包括值為空的指
針變量;
[0013]第一獲取模塊,用于獲取所述隊(duì)尾指針變量的值;
[0014]第一判斷模塊,用于判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空;[0015]加入模塊,用于當(dāng)獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空時(shí),則確定所述隊(duì)尾指針變量的值被更新,獲取所述隊(duì)尾指針變量更新后的值,直至判斷所述隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將所述第二節(jié)點(diǎn)加入所述隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向所述第二節(jié)點(diǎn)。
[0016]本發(fā)明實(shí)施例提供的技術(shù)方案的有益效果是:
[0017]通過創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),獲取隊(duì)尾指針變量的值,并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則確定隊(duì)尾指針變量的值被更新后,重新獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。實(shí)現(xiàn)了當(dāng)隊(duì)尾指針變量的值因并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)列操作,從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
【專利附圖】
【附圖說明】
[0018]為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0019]圖1是本發(fā)明實(shí)施例一提供的一種隊(duì)列的訪問方法流程圖;
[0020]圖2是本發(fā)明實(shí)施例二提供的一種隊(duì)列的訪問方法流程圖;
[0021]圖3是本發(fā)明實(shí)施例二提供的一種隊(duì)列的訪問方法示意圖;
[0022]圖4是本發(fā)明實(shí)施例三提供的一種隊(duì)列的訪問方法流程圖;
[0023]圖5是本發(fā)明實(shí)施例三提供的一種隊(duì)列的訪問方法示意圖;
[0024]圖6是本發(fā)明實(shí)施例四提供的一種隊(duì)列的訪問方法流程圖;
[0025]圖7是本發(fā)明實(shí)施例四提供的一種隊(duì)列的訪問方法示意圖;
[0026]圖8是本發(fā)明實(shí)施例三提供的一種隊(duì)列的訪問裝置的結(jié)構(gòu)示意圖;
[0027]圖9是本發(fā)明實(shí)施例四提供的一種終端的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0028]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
[0029]實(shí)施例一
[0030]由于在進(jìn)行隊(duì)列訪問時(shí),若使用加鎖的方法實(shí)現(xiàn)多個(gè)線程對(duì)隊(duì)列進(jìn)行訪問,一個(gè)線程訪問隊(duì)列,對(duì)該隊(duì)列加鎖,若另一個(gè)線程需要對(duì)隊(duì)列進(jìn)行訪問,由于該隊(duì)列已經(jīng)加鎖,此時(shí)該線程會(huì)由運(yùn)行狀態(tài)變?yōu)榈却隣顟B(tài),并進(jìn)行上下文切換。而進(jìn)行上下文切換的過程需要占用的資源較多,且耗費(fèi)時(shí)間較長。另外,占用隊(duì)列的線程若未及時(shí)解鎖,可能會(huì)造成其它需要訪問該隊(duì)列的線程等待較長時(shí)間,因此,通過加鎖的方法實(shí)現(xiàn)隊(duì)列訪問時(shí)的效率不聞。[0031 ] 為了提高隊(duì)列訪問效率,本發(fā)明實(shí)施例提供了 一種隊(duì)列的訪問方法,該方法可以應(yīng)用于終端,該終端包括但不限于手機(jī)、計(jì)算機(jī)、平板電腦等等,本實(shí)施例不對(duì)終端的具體形式進(jìn)行限定。參見圖1,本實(shí)施例提供的方法流程包括:
[0032]101:創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),第二節(jié)點(diǎn)包括值為空的指針變量;
[0033]102:獲取隊(duì)尾指針變量的值;
[0034]103:判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空,若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則重新執(zhí)行步驟102,若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,則執(zhí)行步驟104 ;
[0035]104:將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。
[0036]其中,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)之后,還包括:
[0037]將隊(duì)尾指針變量的值更新為指向第二節(jié)點(diǎn)的值。
[0038]其中,隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),偽節(jié)點(diǎn)中包括指針變量,隊(duì)列還包括隊(duì)頭指針變量,隊(duì)頭指針變量的值用于指向偽節(jié)點(diǎn),該方法還包括:
[0039]獲取隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0040]若偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,并判斷兩次獲取到的隊(duì)頭指針變量的值是否相同;
[0041]若兩次獲取到的隊(duì)頭指針變量的值不同,則確定偽節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn)。
[0042]其中,將偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)更新為新的偽節(jié)點(diǎn)之后,還包括:
[0043]將隊(duì)頭指針變量的值更新為指向新的偽節(jié)點(diǎn)的值。
[0044]其中,隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),隊(duì)列還包括隊(duì)頭指針變量,隊(duì)頭指針變量的值用于指向偽節(jié)點(diǎn),該方法還包括:
[0045]獲取隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0046]若獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,并判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否相同;
[0047]若兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值不同,則確定偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,直至判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值相同,刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)。
[0048]其中,刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)之后,還包括:
[0049]將偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。[0050]其中,判斷獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否為空之后,還包括:
[0051]若隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,則返回刪除節(jié)點(diǎn)失敗的提示。
[0052]本實(shí)施例提供的方法,通過創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,確定隊(duì)尾指針變量的值被更新后,重新獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。實(shí)現(xiàn)了當(dāng)隊(duì)尾指針變量的值因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)操作。另外,通過獲取隊(duì)頭指針變量的值,并在判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,判斷兩次獲取到的隊(duì)頭指針變量的值不同,確定偽節(jié)點(diǎn)被更新時(shí),重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn),或者刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn),實(shí)現(xiàn)了當(dāng)偽節(jié)點(diǎn)或偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的出隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0053]實(shí)施例二
[0054]本發(fā)明實(shí)施例提供了 一種隊(duì)列的訪問方法,結(jié)合上述實(shí)施例一的內(nèi)容,本實(shí)施例以隊(duì)列的訪問為入隊(duì)列操作為例,對(duì)本實(shí)施例提供的方法進(jìn)行舉例說明。參見圖2,本實(shí)施例提供的方法流程包括:
[0055]201:創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),第二節(jié)點(diǎn)包括值為空的指針變量;
[0056]隊(duì)列中至少包含一個(gè)第一節(jié)點(diǎn)、隊(duì)尾指針變量,隊(duì)尾指針變量的值用于指向隊(duì)列的尾節(jié)點(diǎn),尾節(jié)點(diǎn)為第一節(jié)點(diǎn),隊(duì)列包含的每個(gè)第一節(jié)點(diǎn)中至少包含一個(gè)指針變量,指針變量的值用于指向當(dāng)前所在節(jié)點(diǎn)所連接的下一個(gè)節(jié)點(diǎn),尾節(jié)點(diǎn)包含的指針變量的值為空。
[0057]本實(shí)施例不對(duì)隊(duì)列的構(gòu)建方式作具體限定,包括但不限于:隊(duì)列在共享內(nèi)存上進(jìn)行構(gòu)建,共享內(nèi)存空間預(yù)先根據(jù)隊(duì)列中的節(jié)點(diǎn)大小劃分成相同大小的塊作為內(nèi)存塊,每一個(gè)內(nèi)存塊用于保存隊(duì)列中的一個(gè)節(jié)點(diǎn)。另外,為了對(duì)內(nèi)存塊進(jìn)行管理,每個(gè)內(nèi)存塊前面可設(shè)置有一塊區(qū)域存儲(chǔ)一個(gè)標(biāo)識(shí)位,用于標(biāo)識(shí)該內(nèi)存塊是空閑的,還是已經(jīng)被使用。由于隊(duì)列是在共享內(nèi)存上進(jìn)行構(gòu)建,對(duì)應(yīng)的,對(duì)隊(duì)列進(jìn)行訪問其實(shí)是基于共享內(nèi)存的,即并行對(duì)隊(duì)列進(jìn)行訪問是并行對(duì)共享內(nèi)存進(jìn)行訪問。另外,并行對(duì)隊(duì)列進(jìn)行訪問的執(zhí)行主體可以為多個(gè)線程或者多個(gè)進(jìn)程,因此,并行對(duì)隊(duì)列進(jìn)行訪問可以是跨進(jìn)程或跨線程的隊(duì)列訪問,從而能夠提聞對(duì)隊(duì)列訪問的效率。
[0058]其中,隊(duì)列可以通過鏈表結(jié)構(gòu)來進(jìn)行管理,即下一個(gè)節(jié)點(diǎn)的位置由上一個(gè)節(jié)點(diǎn)存儲(chǔ),每個(gè)節(jié)點(diǎn)除了包含自身的信息外,還有一個(gè)節(jié)點(diǎn)頭用于指向下一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)頭后才是節(jié)點(diǎn)的內(nèi)容。為了存儲(chǔ)節(jié)點(diǎn)頭的信息,在共享內(nèi)存的頭部中劃出一個(gè)保留區(qū),保留區(qū)后的空間才被劃分等大的內(nèi)存塊。保留區(qū)中共存有三項(xiàng)信息:隊(duì)列是否已經(jīng)初始化標(biāo)識(shí)位init,頭節(jié)點(diǎn)的位置即隊(duì)頭指針變量的值head,尾節(jié)點(diǎn)的位置即隊(duì)尾指針變量的值tail。每個(gè)第一節(jié)點(diǎn)的指針變量可以存儲(chǔ)在每個(gè)節(jié)點(diǎn)的節(jié)點(diǎn)頭中,本實(shí)施例對(duì)此不作具體限定。
[0059]創(chuàng)建一個(gè)待加入隊(duì)列的第二節(jié)點(diǎn),第二節(jié)點(diǎn)包含節(jié)點(diǎn)內(nèi)容和一個(gè)指針變量,當(dāng)然,創(chuàng)建的第二節(jié)點(diǎn)中還可以包含其它內(nèi)容,本實(shí)施例對(duì)此不作具體限定。需要說明的是,為了后續(xù)方便地進(jìn)行隊(duì)列訪問,創(chuàng)建一個(gè)待加入隊(duì)列的第二節(jié)點(diǎn)后,可以對(duì)第二節(jié)點(diǎn)中的指針變量做初始化的操作。由于該第二節(jié)點(diǎn)將作為新節(jié)點(diǎn)加入隊(duì)列中,則可以將該第二節(jié)點(diǎn)中的指針變量的值設(shè)置為空,本實(shí)施例對(duì)此不做具體限定。
[0060]202:獲取隊(duì)尾指針變量的值;
[0061]隊(duì)尾指針變量的值可以通過讀取保留區(qū)中tail的值,從而可獲取隊(duì)尾指針變量的值。當(dāng)然,獲取隊(duì)尾指針變量的值還可以采用其它方法,本實(shí)施例對(duì)此不作具體限定。
[0062]203:判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空,若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則重新執(zhí)行步驟202,若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,則執(zhí)行步驟204 ;
[0063]由于隊(duì)尾指針變量的值指向的是隊(duì)列中最后一個(gè)節(jié)點(diǎn),當(dāng)單線程對(duì)隊(duì)列進(jìn)行訪問時(shí),每次入隊(duì)完畢后,隊(duì)尾指針變量的值所指向的隊(duì)列中最后一個(gè)節(jié)點(diǎn)中包含的指針變量的值始終為空。當(dāng)多個(gè)線程并行對(duì)隊(duì)列進(jìn)行訪問時(shí),若有一個(gè)線程改變了隊(duì)尾指針變量的值所指向的隊(duì)列中最后一個(gè)節(jié)點(diǎn)中包含的指針變量的值,其它線程再讀取時(shí),就會(huì)導(dǎo)致讀取出的隊(duì)尾指針變量的值所指向的隊(duì)列中最后一個(gè)節(jié)點(diǎn)中包含的指針變量的值不為空,即獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空。此時(shí)可確定隊(duì)尾指針變量的值被更新,重新返回步驟202獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,再執(zhí)行步驟204。
[0064]204:將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn);
[0065]將第二節(jié)點(diǎn)加入隊(duì)列后,本實(shí)施例不對(duì)將獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值指向第二節(jié)點(diǎn)的方式作具體限定,包括但不限于:獲取第二節(jié)點(diǎn)在內(nèi)存中的存儲(chǔ)地址,將該存儲(chǔ)地址賦值給隊(duì)尾指針變量所指向的第一節(jié)點(diǎn)中包含的指針變量,從而使隊(duì)尾指針變量所指向的第一節(jié)點(diǎn)中包含的指針變量的值指向第二節(jié)點(diǎn)。
[0066]需要說明的是,為了方便后續(xù)進(jìn)行隊(duì)列的訪問操作,在隊(duì)列之外設(shè)置一個(gè)偽節(jié)點(diǎn)用于輔助管理隊(duì)列,即將該偽節(jié)點(diǎn)看作隊(duì)列之外的節(jié)點(diǎn)。當(dāng)隊(duì)列初始化后,隊(duì)列為空時(shí),隊(duì)頭指針變量和隊(duì)尾指針變量的值都指向這個(gè)偽節(jié)點(diǎn),偽節(jié)點(diǎn)中的節(jié)點(diǎn)頭和節(jié)點(diǎn)內(nèi)容都為空。
[0067]例如,以隊(duì)列為空,該隊(duì)列之外包含一個(gè)用于輔助管理隊(duì)列的偽節(jié)點(diǎn)為例,將該偽節(jié)點(diǎn)記為dummy節(jié)點(diǎn),待加入隊(duì)列的新節(jié)點(diǎn)即為第二節(jié)點(diǎn)。如圖3所示中的步驟A,將隊(duì)尾指針變量的值所指向的dummy節(jié)點(diǎn)中包含的指針變量的值指向新節(jié)點(diǎn),即指向第二節(jié)點(diǎn)。
[0068]由于隊(duì)列中新加入了第二節(jié)點(diǎn),因而隊(duì)列的尾節(jié)點(diǎn)為該新加入的第二節(jié)點(diǎn),在實(shí)現(xiàn)第二節(jié)點(diǎn)的入隊(duì)操作之后,本實(shí)施例提供的方法還包括后續(xù)更新隊(duì)尾指針變量的值的步驟。
[0069]205:將隊(duì)尾指針變量的值更新為指向第二節(jié)點(diǎn)的值。
[0070]本實(shí)施例不對(duì)將隊(duì)尾指針變量的值更新為指向第二節(jié)點(diǎn)的值的更新方式作具體限定,包括但不限于:獲取第二節(jié)點(diǎn)在內(nèi)存中的存儲(chǔ)地址,將該存儲(chǔ)地址賦值給隊(duì)尾指針變量,從而使隊(duì)尾指針變量的值指向第二節(jié)點(diǎn)。
[0071]例如,如圖3所示中的步驟B,將隊(duì)尾指針變量Tail的值指向待加入隊(duì)列的新節(jié)點(diǎn),其中待加入隊(duì)列的新節(jié)點(diǎn)即為第二節(jié)點(diǎn)。
[0072]本實(shí)施例提供的方法,通過創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,確定隊(duì)尾指針變量的值被更新后,重新獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。實(shí)現(xiàn)了當(dāng)隊(duì)尾指針變量的值因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0073]實(shí)施例三
[0074]本發(fā)明實(shí)施例提供了 一種隊(duì)列的訪問方法,結(jié)合上述實(shí)施例一的內(nèi)容,對(duì)本實(shí)施例提供的方法進(jìn)行舉例說明。參見圖4,本實(shí)施例提供的方法流程包括:
[0075]401:獲取隊(duì)頭指針變量的值;
[0076]隊(duì)列中至少包含一個(gè)第一節(jié)點(diǎn)、隊(duì)尾指針變量,隊(duì)尾指針變量的值用于指向隊(duì)列的尾節(jié)點(diǎn),尾節(jié)點(diǎn)為第一節(jié)點(diǎn),隊(duì)列包含的每個(gè)第一節(jié)點(diǎn)中至少包含一個(gè)指針變量,指針變量的值用于指向當(dāng)前所在節(jié)點(diǎn)所連接的下一個(gè)節(jié)點(diǎn),尾節(jié)點(diǎn)包含的指針變量的值為空。此夕卜,隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),偽節(jié)點(diǎn)中包括指針變量,隊(duì)列還包括隊(duì)頭指針變量,隊(duì)頭指針變量的值用于指向偽節(jié)點(diǎn)。隊(duì)頭指針變量的值可以通過讀取保留區(qū)中head的值,從而可獲取隊(duì)頭指針變量的值。當(dāng)然,獲取隊(duì)頭指針變量的值還可以采用其它方法,本實(shí)施例對(duì)此不作具體限定。
[0077]402:判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空,若偽節(jié)點(diǎn)中包含的指針變量的值為非空,則執(zhí)行步驟403,若隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,則執(zhí)行步驟407 ;
[0078]由于隊(duì)列之外設(shè)置有一個(gè)偽節(jié)點(diǎn),即du_y節(jié)點(diǎn),該偽節(jié)點(diǎn)僅用于方便對(duì)隊(duì)列進(jìn)行操作,偽節(jié)點(diǎn)之后的節(jié)點(diǎn)才是隊(duì)列中真正的節(jié)點(diǎn)。因此,當(dāng)偽節(jié)點(diǎn)后面沒有后續(xù)節(jié)點(diǎn)時(shí),此時(shí),做出隊(duì)操作即刪除隊(duì)列中的節(jié)點(diǎn)是沒有意義的,從而需要判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空。本實(shí)施例不對(duì)判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空的判斷方式作具體限定,包括但不限于:根據(jù)獲取到的隊(duì)頭指針變量的值確定隊(duì)頭指針變量所指向的偽節(jié)點(diǎn)。若偽節(jié)點(diǎn)中包含的指針變量的值為非空,則意味著隊(duì)列中包含有節(jié)點(diǎn),則執(zhí)行步驟403,若隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,則意味著隊(duì)列為空,執(zhí)行步驟407。
[0079]403:在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值;
[0080]本實(shí)施例不對(duì)在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值的獲取方式作具體限定,即關(guān)于獲取隊(duì)頭指針變量的值的兩個(gè)不同的時(shí)間點(diǎn),本實(shí)施例不作具體限定。包括但不限于:當(dāng)需要進(jìn)行出隊(duì)操作時(shí),讀取保留區(qū)head的值,從而獲取隊(duì)頭指針變量的值。當(dāng)每隔預(yù)設(shè)時(shí)間段后準(zhǔn)備執(zhí)行步驟404中的判斷操作時(shí),再讀取保留區(qū)head的值,從而再次獲取隊(duì)頭指針變量的值。本實(shí)施例不對(duì)預(yù)設(shè)時(shí)間段的大小進(jìn)行限定。
[0081]404:判斷兩次獲取到的隊(duì)頭指針變量的值是否相同,若兩次獲取到的隊(duì)頭指針變量的值不同,則重新執(zhí)行步驟403,若兩次獲取到的隊(duì)頭指針變量的值相同,則執(zhí)行步驟405 ;[0082]由于隊(duì)頭指針變量的值指向的是隊(duì)列中的偽節(jié)點(diǎn),當(dāng)單線程對(duì)隊(duì)列進(jìn)行訪問時(shí),每次出隊(duì)完畢后,隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)為真正的偽節(jié)點(diǎn)。當(dāng)多個(gè)線程并行對(duì)隊(duì)列進(jìn)行訪問時(shí),若有一個(gè)線程改變了隊(duì)頭指針變量的值,其它線程再讀取時(shí),就會(huì)導(dǎo)致讀取出的隊(duì)頭指針變量的值所指向的節(jié)點(diǎn)并不是真正的偽節(jié)點(diǎn),即兩次獲取到的隊(duì)頭指針變量的值不相同。此時(shí)可確定隊(duì)頭指針變量的值被更新,獲取隊(duì)頭指針變量更新后的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,再執(zhí)行步驟405。
[0083]405:釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn);
[0084]本實(shí)施例不對(duì)釋放被更新的偽節(jié)點(diǎn)的釋放方式作具體限定,包括但不限于:將存儲(chǔ)被更新的偽節(jié)點(diǎn)在內(nèi)存中的存儲(chǔ)空間收回,從而釋放被更新的偽節(jié)點(diǎn)。
[0085]例如,如圖5所示,釋放圖5中的偽節(jié)點(diǎn)dummy節(jié)點(diǎn)為被更新的偽節(jié)點(diǎn),將dummy節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)I作為新的偽節(jié)點(diǎn)。
[0086]由于隊(duì)列中的節(jié)點(diǎn)被作為新的偽節(jié)點(diǎn),而新的偽節(jié)點(diǎn)不屬于隊(duì)列,因而實(shí)現(xiàn)了節(jié)點(diǎn)的出隊(duì)操作。在實(shí)現(xiàn)節(jié)點(diǎn)的出隊(duì)操作之后,由于原來的偽節(jié)點(diǎn)更新為新的偽節(jié)點(diǎn),因而本實(shí)施例提供的方法還包括后續(xù)更新隊(duì)頭指針變量的值的步驟。
[0087]406:將隊(duì)頭指針變量的值更新為指向新的偽節(jié)點(diǎn)的值,此次訪問隊(duì)列結(jié)束;
[0088]本實(shí)施例不對(duì)將隊(duì)頭指針變量的值更新為指向新的偽節(jié)點(diǎn)的值的更新方式作具體限定,包括但不限于:獲取新的偽節(jié)點(diǎn)在內(nèi)存中的存儲(chǔ)地址,將該存儲(chǔ)地址賦值隊(duì)頭指針變量,從而使隊(duì)頭指針變量的值更新為指向新的偽節(jié)點(diǎn)的值,即隊(duì)頭指針變量的值指向新的偽節(jié)點(diǎn)。
[0089]407:返回刪除節(jié)點(diǎn)失敗的提示。
[0090]由于隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,即意味著偽節(jié)點(diǎn)之后沒有節(jié)點(diǎn),即隊(duì)列為空,出隊(duì)操作無需進(jìn)行,因而可返回刪除節(jié)點(diǎn)失敗的提示。本實(shí)施例不對(duì)返回刪除節(jié)點(diǎn)失敗的提示的返回方式作具體限定,包括但不限于:向系統(tǒng)返回錯(cuò)誤標(biāo)識(shí),系統(tǒng)根據(jù)錯(cuò)誤標(biāo)識(shí)進(jìn)行報(bào)錯(cuò)。
[0091]本實(shí)施例提供的方法,通過獲取隊(duì)頭指針變量的值,并在判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,判斷兩次獲取到的隊(duì)頭指針變量的值不同,確定偽節(jié)點(diǎn)被更新時(shí),重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn),實(shí)現(xiàn)了當(dāng)偽節(jié)點(diǎn)因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的出隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0092]實(shí)施例四
[0093]本發(fā)明實(shí)施例提供了 一種隊(duì)列的訪問方法,該方法與上述實(shí)施例三均以出隊(duì)操作為例,對(duì)隊(duì)列的訪問方法進(jìn)行舉例說明。本實(shí)施例與上述實(shí)施例三的不同之處在于,上述實(shí)施例三是通過將出隊(duì)列的節(jié)點(diǎn)更新為新的偽節(jié)點(diǎn),并釋放原來的偽節(jié)點(diǎn)的方式實(shí)現(xiàn)出隊(duì)操作。而本實(shí)施例中,將偽節(jié)點(diǎn)固定不變,通過刪除隊(duì)列中的節(jié)點(diǎn)實(shí)現(xiàn)出隊(duì)操作,具體內(nèi)容將結(jié)合上述實(shí)施例一的內(nèi)容,對(duì)本實(shí)施例提供的方法進(jìn)行舉例說明。參見圖6,本實(shí)施例提供的方法流程包括:[0094]601:獲取隊(duì)頭指針變量的值;
[0095]本實(shí)施例不對(duì)獲取隊(duì)頭指針變量的值的獲取方式作具體限定,具體實(shí)施時(shí)可參考實(shí)施例三中的步驟401的內(nèi)容,此處不再贅述。
[0096]602:判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空,若偽節(jié)點(diǎn)中包含的指針變量的值為非空,則執(zhí)行步驟603,若隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,則執(zhí)行步驟607 ;
[0097]本實(shí)施例不對(duì)獲取隊(duì)頭指針變量的值的獲取方式作具體限定,也不對(duì)判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空的判斷方式作具體限定,具體實(shí)施時(shí)可以參考實(shí)施例三中的步驟402,此處不再贅述。
[0098]603:在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值;
[0099]本實(shí)施例在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值的獲取方式作具體限定,包括但不限于:當(dāng)需要進(jìn)行出隊(duì)操作時(shí),讀取保留區(qū)head的值,從而獲取隊(duì)頭指針變量的值,再獲取隊(duì)頭指針變量的值中包含的指針變量的值,即偽節(jié)點(diǎn)中包含的指針變量的值。當(dāng)準(zhǔn)備執(zhí)行步驟604中的判斷操作時(shí),再次讀取保留區(qū)head的值,從而再次獲取隊(duì)頭指針變量的值中包含的指針變量的值。
[0100]604:判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否相同,若兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值不同,則重新執(zhí)行步驟603,若兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值相同,則執(zhí)行步驟605 ;
[0101]由于偽節(jié)點(diǎn)中包含的指針變量的值指向的是隊(duì)列中頭節(jié)點(diǎn),當(dāng)串行對(duì)隊(duì)列進(jìn)行訪問時(shí),每次出隊(duì)完畢后,偽節(jié)點(diǎn)中包含的指針變量的值指向的是隊(duì)列中真正的頭節(jié)點(diǎn)。當(dāng)并行對(duì)隊(duì)列進(jìn)行訪問時(shí),若其中一次訪問改變了偽節(jié)點(diǎn)中包含的指針變量的值,再次訪問并讀取偽節(jié)點(diǎn)中包含的指針變量的值,就會(huì)導(dǎo)致讀取出的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)并不是之前的頭節(jié)點(diǎn),即兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值不相同,此時(shí)確定偽節(jié)點(diǎn)中包含的指針變量的值被更新,獲取偽節(jié)點(diǎn)中包含的指針變量更新后的值,直至判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值相同,再執(zhí)行步驟605。
[0102]605:刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn);
[0103]本實(shí)施例不對(duì)刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)的刪除方式作具體限定,包括但不限于:將偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)釋放,從而刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)。
[0104]例如,如圖7所示,將偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)I釋放,從而刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)I。
[0105]606:將偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),此次訪問隊(duì)列結(jié)束;
[0106]本實(shí)施例不對(duì)將偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的方式作具體限定,包括但不限于:獲取偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)在內(nèi)存中的存儲(chǔ)地址,將該存儲(chǔ)地址賦值給偽節(jié)點(diǎn)中包含的指針變量,從而使偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
[0107]例如,如圖7所示,偽節(jié)點(diǎn)dummy節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),即節(jié)點(diǎn)2。[0108]607:返回刪除節(jié)點(diǎn)失敗的提示。
[0109]本實(shí)施例不對(duì)返回刪除節(jié)點(diǎn)失敗的提示的返回方式作具體限定,具體實(shí)施時(shí)可參考實(shí)施例三中的步驟407,此處不再贅述。
[0110]本實(shí)施例提供的方法,通過獲取隊(duì)頭指針變量的值,并在判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值不同,確定偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)被更新時(shí),重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,直至判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值相同,刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn),實(shí)現(xiàn)了當(dāng)偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的出隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0111]實(shí)施例五
[0112]本發(fā)明實(shí)施例提供了 一種隊(duì)列的訪問裝置,該裝置用于執(zhí)行上述實(shí)施例一至實(shí)施例四提供的方法。參見圖8,該裝置包括:
[0113]創(chuàng)建模塊801,用于創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),第二節(jié)點(diǎn)包括值為空的指針變量;
[0114]第一獲取模塊802,用于獲取隊(duì)尾指針變量的值;
[0115]第一判斷模塊803,用于判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0116]加入模塊804,用于當(dāng)獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空時(shí),則確定隊(duì)尾指針變量的值被更新,獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。
[0117]作為一種優(yōu)選實(shí)施例,該裝置還包括:
[0118]第一更新模塊,用于將隊(duì)尾指針變量的值更新為指向第二節(jié)點(diǎn)的值。
[0119]作為一種優(yōu)選實(shí)施例,該裝置還包括:
[0120]第二獲取模塊,用于獲取隊(duì)頭指針變量的值;
[0121]第二判斷模塊,用于判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0122]第三獲取模塊,用于當(dāng)偽節(jié)點(diǎn)中包含的指針變量的值為非空時(shí),則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值;
[0123]第三判斷模塊,用于判斷兩次獲取到的隊(duì)頭指針變量的值是否相同;
[0124]第一刪除模塊,用于當(dāng)兩次獲取到的隊(duì)頭指針變量的值不同時(shí),則確定偽節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn)。
[0125]作為一種優(yōu)選實(shí)施例,該裝置還包括:
[0126]第二更新模塊,用于將隊(duì)頭指針變量的值更新為指向新的偽節(jié)點(diǎn)的值。
[0127]作為一種優(yōu)選實(shí)施例,該裝置還包括:
[0128]第四獲取模塊,用于獲取隊(duì)頭指針變量的值;[0129]第四判斷模塊,用于判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0130]第五獲取模塊,用于當(dāng)獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空時(shí),則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值;
[0131]第五判斷模塊,用于判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否相同;
[0132]第二刪除模塊,用于當(dāng)兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值不同時(shí),則確定偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,直至判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值相同,刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)。
[0133]作為一種優(yōu)選實(shí)施例,該裝置還包括:
[0134]第三更新模塊,用于將偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
[0135]作為一種優(yōu)選實(shí)施例,該裝置還包括:
[0136]返回模塊,用于當(dāng)隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空時(shí),則返回刪除節(jié)點(diǎn)失敗的提示。
[0137]本實(shí)施例提供的裝置,通過創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,確定隊(duì)尾指針變量的值被更新后,重新獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。實(shí)現(xiàn)了當(dāng)隊(duì)尾指針變量的值因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)操作。另外,通過獲取隊(duì)頭指針變量的值,并在判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,判斷兩次獲取到的隊(duì)頭指針變量的值不同,確定偽節(jié)點(diǎn)被更新時(shí),重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn),或者刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn),實(shí)現(xiàn)了當(dāng)偽節(jié)點(diǎn)或偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的出隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0138]實(shí)施例七
[0139]本實(shí)施例提供了一種終端,該終端可以用于執(zhí)行上述實(shí)施例中隊(duì)列的訪問方法。參見圖9,該終端900包括:
[0140]終端900可以包括RF (Radio Frequency,射頻)電路110、包括有一個(gè)或一個(gè)以上計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的存儲(chǔ)器120、輸入單元130、顯示單元140、傳感器150、音頻電路160、WiFi (Wireless Fidelity,無線保真)模塊170、包括有一個(gè)或者一個(gè)以上處理核心的處理器180、以及電源190等部件。本領(lǐng)域技術(shù)人員可以理解,圖9中示出的終端結(jié)構(gòu)并不構(gòu)成對(duì)終端的限定,可以包括比圖示更多或更少的部件,或者組合某些部件,或者不同的部件布置。其中:
[0141]RF電路110可用于收發(fā)信息或通話過程中,信號(hào)的接收和發(fā)送,特別地,將基站的下行信息接收后,交由一個(gè)或者一個(gè)以上處理器180處理;另外,將涉及上行的數(shù)據(jù)發(fā)送給基站。通常,RF電路110包括但不限于天線、至少一個(gè)放大器、調(diào)諧器、一個(gè)或多個(gè)振蕩器、用戶身份模塊(SIM)卡、收發(fā)信機(jī)、稱合器、LNA (Low Noise Amplifier,低噪聲放大器)、雙工器等。此外,RF電路110還可以通過無線通信與網(wǎng)絡(luò)和其他設(shè)備通信。所述無線通信可以使用任一通信標(biāo)準(zhǔn)或協(xié)議,包括但不限于GSM(Global System of Mobilecommunication,全球移動(dòng)通訊系統(tǒng))、GPRS (General Packet Radio Service,通用分組無線服務(wù))、CDMA (Code Division Multiple Access,碼分多址)、WCDMA (Wideband CodeDivision Multiple Access,寬帶碼分多址)、LTE (Long Term Evolution,長期演進(jìn))、電子郵件、SMS (Short Messaging Service,短消息服務(wù))等。
[0142]存儲(chǔ)器120可用于存儲(chǔ)軟件程序以及模塊,處理器180通過運(yùn)行存儲(chǔ)在存儲(chǔ)器120的軟件程序以及模塊,從而執(zhí)行各種功能應(yīng)用以及數(shù)據(jù)處理。存儲(chǔ)器120可主要包括存儲(chǔ)程序區(qū)和存儲(chǔ)數(shù)據(jù)區(qū),其中,存儲(chǔ)程序區(qū)可存儲(chǔ)操作系統(tǒng)、至少一個(gè)功能所需的應(yīng)用程序(比如聲音播放功能、圖像播放功能等)等;存儲(chǔ)數(shù)據(jù)區(qū)可存儲(chǔ)根據(jù)終端900的使用所創(chuàng)建的數(shù)據(jù)(比如音頻數(shù)據(jù)、電話本等)等。此外,存儲(chǔ)器120可以包括高速隨機(jī)存取存儲(chǔ)器,還可以包括非易失性存儲(chǔ)器,例如至少一個(gè)磁盤存儲(chǔ)器件、閃存器件、或其他易失性固態(tài)存儲(chǔ)器件。相應(yīng)地,存儲(chǔ)器120還可以包括存儲(chǔ)器控制器,以提供處理器180和輸入單元130對(duì)存儲(chǔ)器120的訪問。
[0143]輸入單元130可用于接收輸入的數(shù)字或字符信息,以及產(chǎn)生與用戶設(shè)置以及功能控制有關(guān)的鍵盤、鼠標(biāo)、操作桿、光學(xué)或者軌跡球信號(hào)輸入。具體地,輸入單元130可包括觸敏表面131以及其他輸入設(shè)備132。觸敏表面131,也稱為觸摸顯示屏或者觸控板,可收集用戶在其上或附近的觸摸操作(比如用戶使用手指、觸筆等任何適合的物體或附件在觸敏表面131上或在觸敏表面131附近的操作),并根據(jù)預(yù)先設(shè)定的程式驅(qū)動(dòng)相應(yīng)的連接裝置。可選的,觸敏表面131可包括觸摸檢測裝置和觸摸控制器兩個(gè)部分。其中,觸摸檢測裝置檢測用戶的觸摸方位,并檢測觸摸操作帶來的信號(hào),將信號(hào)傳送給觸摸控制器;觸摸控制器從觸摸檢測裝置上接收觸摸信息,并將它轉(zhuǎn)換成觸點(diǎn)坐標(biāo),再送給處理器180,并能接收處理器180發(fā)來的命令并加以執(zhí)行。此外,可以采用電阻式、電容式、紅外線以及表面聲波等多種類型實(shí)現(xiàn)觸敏表面131。除了觸敏表面131,輸入單元130還可以包括其他輸入設(shè)備132。具體地,其他輸入設(shè)備132可以包括但不限于物理鍵盤、功能鍵(比如音量控制按鍵、開關(guān)按鍵等)、軌跡球、鼠標(biāo)、操作桿等中的一種或多種。
[0144]顯示單元140可用于顯示由用戶輸入的信息或提供給用戶的信息以及終端900的各種圖形用戶接口,這些圖形用戶接口可以由圖形、文本、圖標(biāo)、視頻和其任意組合來構(gòu)成。顯示單元140可包括顯示面板141,可選的,可以采用LCD(Liquid Crystal Display,液晶顯示器)、OLED (Organic Light-Emitting Diode,有機(jī)發(fā)光二極管)等形式來配置顯示面板141。進(jìn)一步的,觸敏表面131可覆蓋顯示面板141,當(dāng)觸敏表面131檢測到在其上或附近的觸摸操作后,傳送給處理器180以確定觸摸事件的類型,隨后處理器180根據(jù)觸摸事件的類型在顯示面板141上提供相應(yīng)的視覺輸出。雖然在圖9中,觸敏表面131與顯示面板141是作為兩個(gè)獨(dú)立的部件來實(shí)現(xiàn)輸入和輸入功能,但是在某些實(shí)施例中,可以將觸敏表面131與顯示面板141集成而實(shí)現(xiàn)輸入和輸出功能。
[0145]終端900還可包括至少一種傳感器150,比如光傳感器、運(yùn)動(dòng)傳感器以及其他傳感器。具體地,光傳感器可包括環(huán)境光傳感器及接近傳感器,其中,環(huán)境光傳感器可根據(jù)環(huán)境光線的明暗來調(diào)節(jié)顯示面板141的亮度,接近傳感器可在終端900移動(dòng)到耳邊時(shí),關(guān)閉顯示面板141和/或背光。作為運(yùn)動(dòng)傳感器的一種,重力加速度傳感器可檢測各個(gè)方向上(一般為三軸)加速度的大小,靜止時(shí)可檢測出重力的大小及方向,可用于識(shí)別手機(jī)姿態(tài)的應(yīng)用(比如橫豎屏切換、相關(guān)游戲、磁力計(jì)姿態(tài)校準(zhǔn))、振動(dòng)識(shí)別相關(guān)功能(比如計(jì)步器、敲擊)等;至于終端900還可配置的陀螺儀、氣壓計(jì)、濕度計(jì)、溫度計(jì)、紅外線傳感器等其他傳感器,在此不再贅述。
[0146]音頻電路160、揚(yáng)聲器161,傳聲器162可提供用戶與終端900之間的音頻接口。音頻電路160可將接收到的音頻數(shù)據(jù)轉(zhuǎn)換后的電信號(hào),傳輸?shù)綋P(yáng)聲器161,由揚(yáng)聲器161轉(zhuǎn)換為聲音信號(hào)輸出;另一方面,傳聲器162將收集的聲音信號(hào)轉(zhuǎn)換為電信號(hào),由音頻電路160接收后轉(zhuǎn)換為音頻數(shù)據(jù),再將音頻數(shù)據(jù)輸出處理器180處理后,經(jīng)RF電路110以發(fā)送給比如另一終端,或者將音頻數(shù)據(jù)輸出至存儲(chǔ)器120以便進(jìn)一步處理。音頻電路160還可能包括耳塞插孔,以提供外設(shè)耳機(jī)與終端900的通信。
[0147]WiFi屬于短距離無線傳輸技術(shù),終端900通過WiFi模塊170可以幫助用戶收發(fā)電子郵件、瀏覽網(wǎng)頁和訪問流式媒體等,它為用戶提供了無線的寬帶互聯(lián)網(wǎng)訪問。雖然圖9示出了 WiFi模塊170,但是可以理解的是,其并不屬于終端900的必須構(gòu)成,完全可以根據(jù)需要在不改變發(fā)明的本質(zhì)的范圍內(nèi)而省略。
[0148]處理器180是終端900的控制中心,利用各種接口和線路連接整個(gè)手機(jī)的各個(gè)部分,通過運(yùn)行或執(zhí)行存儲(chǔ)在存儲(chǔ)器120內(nèi)的軟件程序和/或模塊,以及調(diào)用存儲(chǔ)在存儲(chǔ)器120內(nèi)的數(shù)據(jù),執(zhí)行終端900的各種功能和處理數(shù)據(jù),從而對(duì)手機(jī)進(jìn)行整體監(jiān)控??蛇x的,處理器180可包括一個(gè)或多個(gè)處理核心;優(yōu)選的,處理器180可集成應(yīng)用處理器和調(diào)制解調(diào)處理器,其中,應(yīng)用處理器主要處理操作系統(tǒng)、用戶界面和應(yīng)用程序等,調(diào)制解調(diào)處理器主要處理無線通信??梢岳斫獾氖牵鲜稣{(diào)制解調(diào)處理器也可以不集成到處理器180中。
[0149]終端900還包括給各個(gè)部件供電的電源190 (比如電池),優(yōu)選的,電源可以通過電源管理系統(tǒng)與處理器180邏輯相連,從而通過電源管理系統(tǒng)實(shí)現(xiàn)管理充電、放電、以及功耗管理等功能。電源190還可以包括一個(gè)或一個(gè)以上的直流或交流電源、再充電系統(tǒng)、電源故障檢測電路、電源轉(zhuǎn)換器或者逆變器、電源狀態(tài)指示器等任意組件。
[0150]盡管未示出,終端900還可以包括攝像頭、藍(lán)牙模塊等,在此不再贅述。具體在本實(shí)施例中,終端的顯示單元是觸摸屏顯示器,終端還包括有存儲(chǔ)器,以及一個(gè)或者一個(gè)以上的程序,其中一個(gè)或者一個(gè)以上程序存儲(chǔ)于存儲(chǔ)器中,且經(jīng)配置以由一個(gè)或者一個(gè)以上處理器執(zhí)行。所述一個(gè)或者一個(gè)以上程序包含用于執(zhí)行以下操作的指令:
[0151]創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),第二節(jié)點(diǎn)包括值為空的指針變量;
[0152]獲取隊(duì)尾指針變量的值,并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0153]若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則確定隊(duì)尾指針變量的值被更新,獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。
[0154]假設(shè)上述為第一種可能的實(shí)施方式,則在第一種可能的實(shí)施方式作為基礎(chǔ)而提供的第二種可能的實(shí)施方式中,終端的存儲(chǔ)器中,還包含用于執(zhí)行以下操作的指令:[0155]將隊(duì)尾指針變量的值更新為指向第二節(jié)點(diǎn)的值。
[0156]在第一種或第二種可能的實(shí)施方式的任一種實(shí)施方式作為基礎(chǔ)而提供的第三種可能的實(shí)施方式中,終端的存儲(chǔ)器中,還包含用于執(zhí)行以下操作的指令:
[0157]獲取隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0158]若偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,并判斷兩次獲取到的隊(duì)頭指針變量的值是否相同;
[0159]若兩次獲取到的隊(duì)頭指針變量的值不同,則確定偽節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn)。
[0160]在第三種可能的實(shí)施方式作為基礎(chǔ)而提供的第四種可能的實(shí)施方式中,終端的存儲(chǔ)器中,還包含用于執(zhí)行以下操作的指令:
[0161]將隊(duì)頭指針變量的值更新為指向新的偽節(jié)點(diǎn)的值。
[0162]在第一種或第二種可能的實(shí)施方式的任一種實(shí)施方式作為基礎(chǔ)而提供的第五種可能的實(shí)施方式中,終端的存儲(chǔ)器中,還包含用于執(zhí)行以下操作的指令:
[0163]獲取隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0164]若獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,并判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否相同;
[0165]若兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值不同,則確定偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,直至判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值相同,刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)。
[0166]在第五種可能的實(shí)施方式作為基礎(chǔ)而提供的第六種可能的實(shí)施方式中,終端的存儲(chǔ)器中,還包含用于執(zhí)行以下操作的指令:
[0167]將偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
[0168]在第三種或第五種可能的實(shí)施方式的任一種實(shí)施方式作為基礎(chǔ)而提供的第七種可能的實(shí)施方式中,終端的存儲(chǔ)器中,還包含用于執(zhí)行以下操作的指令:
[0169]若隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,則返回刪除節(jié)點(diǎn)失敗的提示。
[0170]本發(fā)明提供的終端,通過創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,確定隊(duì)尾指針變量的值被更新后,重新獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。實(shí)現(xiàn)了當(dāng)隊(duì)尾指針變量的值因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)操作。另外,通過獲取隊(duì)頭指針變量的值,并在判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,判斷兩次獲取到的隊(duì)頭指針變量的值不同,確定偽節(jié)點(diǎn)被更新時(shí),重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn),或者刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn),實(shí)現(xiàn)了當(dāng)偽節(jié)點(diǎn)或偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的出隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0171]實(shí)施例八
[0172]本發(fā)明實(shí)施例還提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是上述實(shí)施例中的存儲(chǔ)器中所包含的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì);也可以是單獨(dú)存在,未裝配入終端中的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)存儲(chǔ)有一個(gè)或者一個(gè)以上程序,該一個(gè)或者一個(gè)以上程序被一個(gè)或者一個(gè)以上的處理器用來執(zhí)行實(shí)現(xiàn)多維數(shù)據(jù)的權(quán)限查詢方法,該方法包括:
[0173]創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),第二節(jié)點(diǎn)包括值為空的指針變量;
[0174]獲取隊(duì)尾指針變量的值,并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0175]若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則確定隊(duì)尾指針變量的值被更新,獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。
[0176]假設(shè)上述為第一種可能的實(shí)施方式,則在第一種可能的實(shí)施方式作為基礎(chǔ)而提供的第二種可能的實(shí)施方式中,所述將所述第二節(jié)點(diǎn)加入所述隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向所述第二節(jié)點(diǎn)之后,還包括:
[0177]將隊(duì)尾指針變量的值更新為指向所述第二節(jié)點(diǎn)的值。
[0178]在第一種或者第二種可能的實(shí)施方式作為基礎(chǔ)而提供的第三種可能的實(shí)施方式中,所述隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),所述偽節(jié)點(diǎn)中包括指針變量,所述隊(duì)列還包括隊(duì)頭指針變量,所述隊(duì)頭指針變量的值用于指向所述偽節(jié)點(diǎn),所述方法還包括:
[0179]獲取隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0180]若偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,并判斷兩次獲取到的隊(duì)頭指針變量的值是否相同;
[0181]若兩次獲取到的隊(duì)頭指針變量的值不同,則確定偽節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn)。
[0182]在第三種可能的實(shí)施方式作為基礎(chǔ)而提供的第四種可能的實(shí)施方式中,所述將所述偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)更新為新的偽節(jié)點(diǎn)之后,還包括:
[0183]將隊(duì)頭指針變量的值更新為指向所述新的偽節(jié)點(diǎn)的值。
[0184]在第一種或者第二種可能的實(shí)施方式作為基礎(chǔ)而提供的第五種可能的實(shí)施方式中,所述隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),所述隊(duì)列還包括隊(duì)頭指針變量,所述隊(duì)頭指針變量的值用于指向所述偽節(jié)點(diǎn),所述方法還包括:
[0185]獲取隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0186]若獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,并判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否相同;
[0187]若兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值不同,則確定偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取偽節(jié)點(diǎn)中包含的指針變量的值,直至判斷兩次獲取到的偽節(jié)點(diǎn)中包含的指針變量的值相同,刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)。
[0188]在第五種可能的實(shí)施方式作為基礎(chǔ)而提供的第六種可能的實(shí)施方式中,所述刪除所述偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)之后,還包括:
[0189]將偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
[0190]在第三種或者第五種可能的實(shí)施方式作為基礎(chǔ)而提供的第五種可能的實(shí)施方式中,所述判斷獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否為空之后,還包括:
[0191]若隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,則返回刪除節(jié)點(diǎn)失敗的提示。
[0192]本發(fā)明實(shí)施例提供的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),通過創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,確定隊(duì)尾指針變量的值被更新后,重新獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。實(shí)現(xiàn)了當(dāng)隊(duì)尾指針變量的值因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)操作。另外,通過獲取隊(duì)頭指針變量的值,并在判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,判斷兩次獲取到的隊(duì)頭指針變量的值不同,確定偽節(jié)點(diǎn)被更新時(shí),重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn),或者刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn),實(shí)現(xiàn)了當(dāng)偽節(jié)點(diǎn)或偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的出隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0193]實(shí)施例九
[0194]本發(fā)明實(shí)施例提供了一種圖形用戶接口,所述圖形用戶接口用在終端上,所述終端包括觸摸屏顯示器、存儲(chǔ)器和用于執(zhí)行一個(gè)或者一個(gè)以上的程序的一個(gè)或者一個(gè)以上的處理器;所述圖形用戶接口包括:
[0195]創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),第二節(jié)點(diǎn)包括值為空的指針變量;
[0196]獲取隊(duì)尾指針變量的值,并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空;
[0197]若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則確定隊(duì)尾指針變量的值被更新,獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。
[0198]本發(fā)明實(shí)施例提供的圖形用戶接口,通過創(chuàng)建待加入隊(duì)列的第二節(jié)點(diǎn),并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,確定隊(duì)尾指針變量的值被更新后,重新獲取隊(duì)尾指針變量更新后的值,直至判斷隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將第二節(jié)點(diǎn)加入隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向第二節(jié)點(diǎn)。實(shí)現(xiàn)了當(dāng)隊(duì)尾指針變量的值因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的入隊(duì)操作。另外,通過獲取隊(duì)頭指針變量的值,并在判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,判斷兩次獲取到的隊(duì)頭指針變量的值不同,確定偽節(jié)點(diǎn)被更新時(shí),重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取隊(duì)頭指針變量的值,直至判斷兩次獲取到的隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn),或者刪除偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn),實(shí)現(xiàn)了當(dāng)偽節(jié)點(diǎn)或偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)因隊(duì)列被并行訪問而發(fā)生更新后,仍然能夠繼續(xù)執(zhí)行節(jié)點(diǎn)的出隊(duì)操作。從而在無需對(duì)隊(duì)列進(jìn)行加鎖的情況下,可對(duì)隊(duì)列并行訪問,進(jìn)而提高了訪問隊(duì)列的效率。
[0199]需要說明的是:上述實(shí)施例提供的隊(duì)列的訪問裝置在訪問隊(duì)列時(shí),僅以上述各功能模塊的劃分進(jìn)行舉例說明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的隊(duì)列的訪問裝置與隊(duì)列的訪問方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過程詳見方法實(shí)施例,這里不再贅述。
[0200]上述本發(fā)明實(shí)施例序號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
[0201]本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等。
[0202]以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種隊(duì)列訪問方法,其特征在于,所述隊(duì)列中至少包含一個(gè)第一節(jié)點(diǎn)、隊(duì)尾指針變量,所述隊(duì)尾指針變量的值用于指向所述隊(duì)列的尾節(jié)點(diǎn),所述尾節(jié)點(diǎn)為第一節(jié)點(diǎn),所述隊(duì)列包含的每個(gè)第一節(jié)點(diǎn)中至少包含一個(gè)指針變量,所述指針變量的值用于指向當(dāng)前所在節(jié)點(diǎn)所連接的下一個(gè)節(jié)點(diǎn),尾節(jié)點(diǎn)包含的指針變量的值為空,所述方法包括: 創(chuàng)建待加入所述隊(duì)列的第二節(jié)點(diǎn),所述第二節(jié)點(diǎn)包括值為空的指針變量; 獲取所述隊(duì)尾指針變量的值,并判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為空; 若獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空,則確定所述隊(duì)尾指針變量的值被更新,獲取所述隊(duì)尾指針變量更新后的值,直至判斷所述隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將所述第二節(jié)點(diǎn)加入所述隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向所述第二節(jié)點(diǎn)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將所述第二節(jié)點(diǎn)加入所述隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向所述第二節(jié)點(diǎn)之后,還包括: 將所述隊(duì)尾指針變量的值更新為指向所述第二節(jié)點(diǎn)的值。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),所述偽節(jié)點(diǎn)中包括指針變量,所述隊(duì)列還包括隊(duì)頭指針變量,所述隊(duì)頭指針變量的值用于指向所述偽節(jié)點(diǎn),所述方法還包括: 獲取所述隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空; 若所述偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述隊(duì)頭指針變量的值,并判斷兩次獲取到的所述隊(duì)頭指針變量的值是否相同; 若兩次獲取到的所述隊(duì)頭指針變量的值不同,則確定所述偽節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述隊(duì)頭指針變量的值,直至判斷兩次獲取到的所述隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將所述被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn)。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述將所述偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)更新為新的偽節(jié)點(diǎn)之后,還包括: 將所述隊(duì)頭指針變量的值更新為指向所述新的偽節(jié)點(diǎn)的值。
5.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),所述隊(duì)列還包括隊(duì)頭指針變量,所述隊(duì)頭指針變量的值用于指向所述偽節(jié)點(diǎn),所述方法還包括: 獲取所述隊(duì)頭指針變量的值,并判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空; 若獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空,則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述偽節(jié)點(diǎn)中包含的指針變量的值,并判斷兩次獲取到的所述偽節(jié)點(diǎn)中包含的指針變量的值是否相同; 若兩次獲取到的所述偽節(jié)點(diǎn)中包含的指針變量的值不同,則確定所述偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述偽節(jié)點(diǎn)中包含的指針變量的值,直至判斷兩次獲取到的所述偽節(jié)點(diǎn)中包含的指針變量的值相同,刪除所述偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述刪除所述偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)之后,還包括: 將所述偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
7.根據(jù)權(quán)利要求3或5所述的方法,其特征在于,所述判斷獲取到的偽節(jié)點(diǎn)中包含的指針變量的值是否為空之后,還包括: 若所述隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空,則返回刪除節(jié)點(diǎn)失敗的提示。
8.一種隊(duì)列的訪問裝置,其特征在于,所述隊(duì)列中至少包含一個(gè)第一節(jié)點(diǎn)、隊(duì)尾指針變量,所述隊(duì)尾指針變量的值用于指向所述隊(duì)列的尾節(jié)點(diǎn),所述尾節(jié)點(diǎn)為第一節(jié)點(diǎn),所述隊(duì)列包含的每個(gè)第一節(jié)點(diǎn)中至少包含一個(gè)指針變量,所述指針變量的值用于指向當(dāng)前所在節(jié)點(diǎn)所連接的下一個(gè)節(jié)點(diǎn),尾節(jié)點(diǎn)包含的指針變量的值為空,所述裝置包括: 創(chuàng)建模塊,用于創(chuàng)建待加入所述隊(duì)列的第二節(jié)點(diǎn),所述第二節(jié)點(diǎn)包括值為空的指針變量; 第一獲取模塊,用于獲取所述隊(duì)尾指針變量的值; 第一判斷模塊,用于判斷獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值是否為 空; 加入模塊,用于當(dāng)獲取到的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為非空時(shí),則確定所述隊(duì)尾指針變量的值被更新,獲取所述隊(duì)尾指針變量更新后的值,直至判斷所述隊(duì)尾指針變量更新后的值所指向的第一節(jié)點(diǎn)中包含的指針變量的值為空,將所述第二節(jié)點(diǎn)加入所述隊(duì)列,并將獲取到的值所指向的第一節(jié)點(diǎn)包含的指針變量的值指向所述第二節(jié)點(diǎn)。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述裝置還包括: 第一更新模塊,用于將所述隊(duì)尾指針變量的值更新為指向所述第二節(jié)點(diǎn)的值。
10.根據(jù)權(quán)利要求8或9所述的裝置,其特征在于,所述隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),所述偽節(jié)點(diǎn)中包括指針變量,所述隊(duì)列還包括隊(duì)頭指針變量,所述隊(duì)頭指針變量的值用于指向所述偽節(jié)點(diǎn),所述裝置還包括: 第二獲取模塊,用于獲取所述隊(duì)頭指針變量的值; 第二判斷模塊,用于判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空; 第三獲取模塊,用于當(dāng)所述偽節(jié)點(diǎn)中包含的指針變量的值為非空時(shí),則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述隊(duì)頭指針變量的值; 第三判斷模塊,用于判斷兩次獲取到的所述隊(duì)頭指針變量的值是否相同; 第一刪除模塊,用于當(dāng)兩次獲取到的所述隊(duì)頭指針變量的值不同時(shí),則確定所述偽節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述隊(duì)頭指針變量的值,直至判斷兩次獲取到的所述隊(duì)頭指針變量的值相同,釋放被更新的偽節(jié)點(diǎn),并將所述被更新的偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)作為新的偽節(jié)點(diǎn)。
11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述裝置還包括: 第二更新模塊,用于將所述隊(duì)頭指針變量的值更新為指向所述新的偽節(jié)點(diǎn)的值。
12.根據(jù)權(quán)利要求8或9所述的裝置,其特征在于,所述隊(duì)列之外還包括一個(gè)偽節(jié)點(diǎn),所述隊(duì)列還包括隊(duì)頭指針變量,所述隊(duì)頭指針變量的值用于指向所述偽節(jié)點(diǎn),所述裝置還包括: 第四獲取模塊,用于獲取所述隊(duì)頭指針變量的值; 第四判斷模塊,用于判斷獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值是否為空; 第五獲取模塊,用于當(dāng)獲取到的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為非空時(shí),則在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述偽節(jié)點(diǎn)中包含的指針變量的值;第五判斷模塊,用于判斷兩次獲取到的所述偽節(jié)點(diǎn)中包含的指針變量的值是否相同;第二刪除模塊,用于當(dāng)兩次獲取到的所述偽節(jié)點(diǎn)中包含的指針變量的值不同時(shí),則確定所述偽節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)被更新,重新在兩個(gè)不同的時(shí)間點(diǎn)上分別獲取所述偽節(jié)點(diǎn)中包含的指針變量的值,直至判斷兩次獲取到的所述偽節(jié)點(diǎn)中包含的指針變量的值相同,刪除所述偽節(jié)點(diǎn)中包含的指針變量的值所指向的節(jié)點(diǎn)。
13.根據(jù)權(quán)利要求12所述的裝置,其特征在于,所述裝置還包括: 第三更新模塊,用于將所述偽節(jié)點(diǎn)中包含的指針變量的值指向被刪除的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
14.根據(jù)權(quán)利要求10或12所述的裝置,其特征在于,所述裝置還包括: 返回模塊,用于當(dāng)所 述隊(duì)頭指針變量的值所指向的偽節(jié)點(diǎn)中包含的指針變量的值為空時(shí),則返回刪除節(jié)點(diǎn)失敗的提示。
【文檔編號(hào)】G06F9/46GK103793267SQ201410033780
【公開日】2014年5月14日 申請(qǐng)日期:2014年1月23日 優(yōu)先權(quán)日:2014年1月23日
【發(fā)明者】賀輝超 申請(qǐng)人:騰訊科技(深圳)有限公司