午夜毛片免费看,老师老少妇黄色网站,久久本道综合久久伊人,伊人黄片子

用于對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法和系統(tǒng)的制作方法

文檔序號:6466680閱讀:196來源:國知局

專利名稱::用于對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域
:本發(fā)明涉及對多線程軟件的開發(fā)和處理,尤其涉及對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法和系統(tǒng)。
背景技術(shù)
:在過去的二十多年的時(shí)間里,隨著微電子技術(shù)的迅猛發(fā)展,計(jì)算機(jī)系統(tǒng)的性能和容量發(fā)生了爆炸性的增長。較多的計(jì)算資源意味著可以按并行的方式來同時(shí)執(zhí)行更多的操作。因此,并行的體系結(jié)構(gòu)以及并行的軟件開發(fā),在信息處理中發(fā)揮越來越核心的作用。一個(gè)進(jìn)程是在計(jì)算機(jī)系統(tǒng)上運(yùn)行的一個(gè)程序或程序的一部分,或者是被某個(gè)程序執(zhí)行的步驟的相關(guān)序列。每個(gè)進(jìn)程包括一個(gè)或多個(gè)線程。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。所以線程基本上是輕量級的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。數(shù)據(jù)結(jié)構(gòu)是一種數(shù)據(jù)的組織方案,例如記錄或數(shù)組,籍此有助于解釋數(shù)據(jù)或執(zhí)行對數(shù)據(jù)的操作。一數(shù)據(jù)結(jié)構(gòu)的一實(shí)例,是指一種數(shù)據(jù)結(jié)構(gòu)的具體實(shí)施對象。對凄大據(jù)結(jié)構(gòu)的實(shí)例的處理,在進(jìn)程或程序中經(jīng)常采用多線程處理,這可以充分利用系統(tǒng)資源,縮短程序響應(yīng)時(shí)間,改善用戶體驗(yàn);如果程序中只使用單線程,那么程序的速度和響應(yīng)無疑會(huì)大打折扣。多線程軟件使得多個(gè)線程可以并行的工作以完成多項(xiàng)任務(wù),以提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候被實(shí)現(xiàn)的。但是,程序采用了多線程后,就必須認(rèn)真考慮線程調(diào)度的問題。如果調(diào)度不當(dāng),要么造成程序出錯(cuò),要么造成荒謬的結(jié)果。眾所周知,與順序執(zhí)行的軟件相比,多線程軟件更加難以開發(fā)。由于多個(gè)線程之間可能存在的未預(yù)料到的沖突,具有并行體系結(jié)構(gòu)的程序經(jīng)常包含程序缺陷。尤其是,如果沒有合適的同步機(jī)制,并行地訪問共享的數(shù)據(jù)結(jié)構(gòu)將產(chǎn)生無法預(yù)料的錯(cuò)誤。到目前為止,人們通常使用兩種方法來開發(fā)多線程軟件?;阪i(lock-based)的方式和無鎖(lock-free)的方式。對于多線程編程和多線程并行處理,基于鎖的方式是一種傳統(tǒng)的方法。該6方法利用加鎖來實(shí)現(xiàn)同步,以便對共享資源進(jìn)行訪問。常用的同步原語(Synchronizationprimitives)如互斥體(mutexes)、旗語(semaphores)和關(guān)4建部件(criticalsections)。這些同步原語通常#1用于確保某些特定的部分代碼不會(huì)被同時(shí)執(zhí)行,否則將會(huì)破壞共享存儲(chǔ)結(jié)構(gòu)。如果一個(gè)線程試圖獲取已經(jīng)被其它線程持有的鎖,則該一個(gè)線程將會(huì)被阻塞(block)直至該鎖被釋放為止。例如,在程序中,很多任務(wù)必須以確定的先后秩序執(zhí)行,對于兩個(gè)線程必須以先后秩序執(zhí)行的情況,可以用線程鎖來處理。線程鎖的大致思想是如果線程A和線程B會(huì)分別執(zhí)行實(shí)例的兩個(gè)函數(shù)a和b,如果A必須在B之前運(yùn)行,那么可以在B進(jìn)入b函數(shù)時(shí)讓B進(jìn)入waitset,直到A執(zhí)行完a函數(shù)再把B從waitset中激活。這樣就保證了B必定在A之后運(yùn)行,無論在之前它們的時(shí)間先后順序是怎樣的?;コ怄i(mutual-exclusionlocks)是目前常用的一種機(jī)制,用于進(jìn)程或線程間的同步。其簡單并且容易實(shí)施。在高性能應(yīng)用的并行計(jì)算環(huán)境里,這種簡易性則無法實(shí)現(xiàn)。當(dāng)使用大量的鎖并且有許多線程并行執(zhí)行時(shí),互斥鎖的可擴(kuò)展性不佳。對于共享數(shù)據(jù)的并行訪問,需要復(fù)雜的細(xì)粒度的鎖策略,來將沒有沖突的操作設(shè)置為并行執(zhí)行。要保持良好的性能,這種策略很難設(shè)計(jì),并且可能隱含問題,如死鎖或優(yōu)先級倒置。由于多種已知的原因,使得不希望線程:帔阻塞。一個(gè)明顯的原因是,如果一個(gè)線程被阻塞,則該線程在該期間無法完成任何任務(wù)。如果被阻塞的線程正在執(zhí)行一個(gè)高優(yōu)先級的任務(wù),或者正在執(zhí)行一個(gè)實(shí)時(shí)的任務(wù),就更加不希望該線程被阻塞。此外,多個(gè)鎖之間的某些沖突還可能導(dǎo)致一些錯(cuò)誤的狀態(tài),如死鎖、活鎖或優(yōu)先級倒置(deadlock,live-lock,orpriorityinversion)。使用鎖還涉及在粗粒度的鎖和細(xì)粒度的鎖兩個(gè)方面之間進(jìn)行折衷,粗粒度的鎖可能會(huì)顯著減少并行執(zhí)行的機(jī)會(huì),細(xì)粒度的鎖需要更加細(xì)致的設(shè)計(jì)并且容易程序缺陷。不加鎖(lock-free)的方式是多線程軟件的開發(fā)和處理的另一種選擇。Lock-free和wait-free才幾制,主要4吏用由硬/f牛才是供的原子原語。大部分通用的硬件均提供這種原子原語指令集。"比較并交換(compareandswap,即CAS)"是最常用的原子原語之一。該原子原語使用三個(gè)參數(shù)(argument):—個(gè)內(nèi)存地址、一個(gè)原始值(已有值)和一個(gè)新的值。如果上述內(nèi)存地址存有一個(gè)原始值,則用新的值替換該原始值,否則存儲(chǔ)的值不變。重要的是,硬件確保"比較并交換"操作被原子地執(zhí)行。該操作的成功才丸行將返回一個(gè)值1或0,并^皮匯報(bào)給程序。這允許一個(gè)算法從內(nèi)存中讀取數(shù)據(jù),修改該數(shù)據(jù),然后只有在沒有其它線程同時(shí)修改該內(nèi)存的數(shù)據(jù)的情況下寫回修改后的數(shù)據(jù)。上述基于鎖的方法和不加鎖的方法,各有如下優(yōu)缺點(diǎn)。基于鎖的方法(Lock-basedapproach)無鎖的方法(Lock-freeapproach)可擴(kuò)展性不好。在進(jìn)入和離開程序關(guān)鍵部分時(shí),線程需要等待。好。有多個(gè)線程在執(zhí)行。魯棒性不好。一個(gè)線程的異常退出可能會(huì)阻礙其它線程。例如,死鎖。好。即使一個(gè)線程死掉,其它線程仍然得以執(zhí)行。容易開發(fā)性相對容易。線程的算法(機(jī)制)與順序執(zhí)行的線程相似。獲得鎖的線程可以阻塞其它未得到鎖的線程的執(zhí)行。非常困難。線程的算法(機(jī)制)與順序執(zhí)行的線程經(jīng)常完全不同。并且,有些操作效率非常低。經(jīng)常需要i正明線程之間的復(fù)雜邏輯的正確性。此外,F(xiàn)raser提到了一種基于MCAS和W-Locks的混合機(jī)制(見Practicallock-freedom,byKeirFraser,2004)。運(yùn)行時(shí)的性能反饋被用于根據(jù)當(dāng)前的竟?fàn)幩絼?dòng)態(tài)選擇使用哪種機(jī)制。該機(jī)制中使用了運(yùn)行時(shí)概要和同步原語之間的切換。
發(fā)明內(nèi)容鑒于已有技術(shù)的不足,本發(fā)明提供了一種新的對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法和系統(tǒng)。對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法包括為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行4喿作;響應(yīng)于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作;為一不應(yīng)無鎖的操作請求獲取所述第一鎖的強(qiáng)鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;以及響應(yīng)于該不應(yīng)無鎖的操作完成獲取該強(qiáng)鎖,執(zhí)行該不應(yīng)無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。本發(fā)明還提供了一種對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的系統(tǒng)。該系統(tǒng)包括弱8鎖裝置,用于為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;可無鎖的操作執(zhí)行裝置,用于響應(yīng)于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作;強(qiáng)鎖裝置,用于為一不應(yīng)無鎖的操作請求獲取所述第一鎖的強(qiáng)鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;以及不應(yīng)無鎖的操作執(zhí)行裝置,用于響應(yīng)于該不應(yīng)無鎖的操作完成獲取該強(qiáng)鎖,執(zhí)行該不應(yīng)無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。與已有技術(shù)相比,根據(jù)本發(fā)明的上述方法和系統(tǒng)可以提高對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的效率。圖la示意性地示出了已有技術(shù)中基于鎖的方法的機(jī)制。圖lb示意性地示出了已有技術(shù)中無鎖實(shí)現(xiàn)的方法。圖2a示意性地示出了已有技術(shù)中基于鎖的方法的異常退出的情況。圖2b示意性地示出了已有技術(shù)中無鎖實(shí)現(xiàn)的方法的異常退出的情況。圖3示出了根據(jù)本發(fā)明一實(shí)施例的用于數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法。圖4a和圖4b示出了根據(jù)本發(fā)明一實(shí)施例的操作執(zhí)行情況。圖5a和圖5b示出了與本發(fā)明實(shí)施例相對比根據(jù)已有技術(shù)的一實(shí)施例的操作執(zhí)行情況。具體實(shí)施例方式數(shù)據(jù)結(jié)構(gòu)是一種數(shù)據(jù)的組織方案,例如記錄或數(shù)組,籍此有助于解釋數(shù)據(jù)或執(zhí)行對數(shù)據(jù)的操作。一數(shù)據(jù)結(jié)構(gòu)的一實(shí)例,是指一種數(shù)據(jù)結(jié)構(gòu)的具體實(shí)施對象。對于涉及多線程處理的一數(shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)結(jié)構(gòu)實(shí)例,為了確保在多線程之間該數(shù)據(jù)結(jié)構(gòu)的一致性(Coherence)或?qū)υ摂?shù)據(jù)結(jié)構(gòu)實(shí)例操作的正確性,對該數(shù)據(jù)結(jié)構(gòu)加鎖是一種常用的方法。本發(fā)明也采用加鎖的方式來確保對數(shù)據(jù)結(jié)構(gòu)操作的正確性。本發(fā)明所利用的鎖的原理本身或用鎖來保護(hù)數(shù)據(jù)結(jié)構(gòu)的鎖機(jī)制本身,與已有技術(shù)相比是相似的。例如,對于需要獲取鎖才能處理的數(shù)據(jù)結(jié)構(gòu)實(shí)例,只有一操作獲取鎖之后才能進(jìn)行處理。對于何種操作進(jìn)行加鎖,附加何種類型的鎖,本發(fā)明的一實(shí)施例在這兩方面與已有技術(shù)是不同的。此外,根據(jù)本發(fā)明的另一實(shí)施例,在獲取不同類型的鎖之后,持有鎖的操作所允許執(zhí)行的操作與已有技術(shù)相比是不同的。以下結(jié)合附圖詳細(xì)說明。不同的已有技術(shù)在何種情況下需要鎖,采取了不同的策略。例如,基于鎖的方法,所有的進(jìn)程或操作都用鎖來保護(hù)。這樣,能夠確保所涉及的數(shù)據(jù)結(jié)構(gòu)的安全性,但是,可擴(kuò)展性較低。如圖la和圖2a所示。圖la示意性地示出了已有技術(shù)中基于鎖的方法的機(jī)制。其中,有四個(gè)線程al、a2、a3和a4需要執(zhí)行。如果線程al獲取了鎖并開始執(zhí)行,則其它三個(gè)線程被阻塞。在線程al完成執(zhí)行后,釋放所持有的鎖。這時(shí),其它三個(gè)線程嘗試獲取鎖。與線程al類似,獲取鎖的進(jìn)程執(zhí)行,其它線程被阻塞。這樣,在進(jìn)入和離開程序關(guān)^l建部分時(shí),多個(gè)線程需要等待。線程的算法或機(jī)制與順序執(zhí)行的線程相似。獲得鎖的線程可以阻塞其它未得到鎖的線程的執(zhí)行。但是,如圖2a所示,這種基于鎖的方式的魯棒性確不好。圖2a示意性地示出了已有技術(shù)中基于鎖的方法的異常退出的情況。其中,一個(gè)持有鎖的線程,如線程la,異常退出可能會(huì)阻礙其它線程。例如,線程la發(fā)生死鎖,其持有的鎖未被釋放,則其它等待的線程就會(huì)長時(shí)間處于不必要的等待狀態(tài)。根據(jù)已有技術(shù)對于鎖的一個(gè)具體應(yīng)用如下例l。例如,一個(gè)傳統(tǒng)的堆棧具有如下的布局。對于已有技術(shù)的多線程或多操作的并行處理,這樣的堆棧是不安全的。例lStackinstance:__top:Node_size:int為確保對該堆棧操作的正確性,根據(jù)已有技術(shù)可以采用如下例2加鎖(lock:LockType)的方式來進(jìn)行。例如,在堆棧的實(shí)例上加鎖。這樣,在對該堆棧進(jìn)行操作前,首先請求獲取該鎖。獲取鎖的操作或線程,可以對該堆棧進(jìn)行操作,并在操作完成后釋放鎖。這時(shí),其它需要對該線程進(jìn)行的操作被阻塞,這些被阻塞的線程可以反復(fù)嘗試獲取鎖,直至得到鎖為止。例2Stackinstance:__lock丄ockType_top:Node_size:int對于每個(gè)堆棧的操作,如push()、pop()或clone()等等,可以調(diào)用lock.lock()來請求獲取鎖,調(diào)用lock.unlock()來釋^:鎖。這樣,可以確保每次只有一個(gè)線程對堆棧進(jìn)行操作。在根據(jù)本發(fā)明的一實(shí)施例中,如下例3所示,可以采用與已有技術(shù)中設(shè)置讀鎖和寫鎖類似的方法,將該鎖設(shè)置為包括弱鎖rLock:WeakLock和強(qiáng)鎖wLock:StrongLock。其中,可以允許有多個(gè)操作/線程同時(shí)分別持有該鎖的多個(gè)弱鎖,但是只允許一個(gè)操作/線程持有該鎖的強(qiáng)鎖,不允許該鎖的弱鎖和強(qiáng)鎖同時(shí)被持有。持有弱鎖或強(qiáng)鎖的操作可以對該堆棧進(jìn)行操作,操作完成之后,釋放其持有的鎖。此外,持有所述該弱鎖的多個(gè)操作可以并行執(zhí)行,如圖lb、圖2b和圖4a所示。而持有強(qiáng)鎖的一操作對該堆棧進(jìn)行操作時(shí),其它需要對該堆棧進(jìn)行的操作將被阻塞。這些被阻塞的操作可以嘗試獲取鎖,如周期性地進(jìn)行嘗試。持有弱鎖的操作對該堆棧進(jìn)行搡作時(shí),其它請求獲取強(qiáng)鎖的搡作將被阻塞,而其它請求獲取弱鎖的操作可以繼續(xù)獲得弱鎖。同樣,這些被阻塞的操作可以嘗試獲取強(qiáng)鎖,如周期性地進(jìn)行嘗試。例3<table>tableseeoriginaldocumentpage11</column></row><table>圖lb示意性地示出了已有技術(shù)中無鎖(Lock-free)實(shí)現(xiàn)的方法。無鎖的方法的出發(fā)點(diǎn)是為了克服基于鎖的方法擴(kuò)展性不好的缺陷。如圖lb所示,在無鎖的方法中,多個(gè)線程bl、b2、b3和b4可以并行執(zhí)行,從而提高進(jìn)程或程序的執(zhí)行效率。無鎖方法不但可擴(kuò)展性好,而且魯棒性也好,如圖2b所示。圖2b示意性地示出了已有技術(shù)中無鎖實(shí)現(xiàn)的方法的異常退出的情況。如圖2b所示,即使一個(gè)線程bl死掉,其它線程b2、b3和b4仍然得以執(zhí)行。但是,無鎖方法的開發(fā)卻非常困難。無鎖方法的線程的算法或執(zhí)行機(jī)制與順序執(zhí)行的線程經(jīng)常完全不同。因此,經(jīng)常需要證明無鎖線程之間的復(fù)雜邏輯的正確性。并且,有些操:作采用無鎖的方法,其執(zhí)行效率非常低。根據(jù)本發(fā)明的一實(shí)施例,將無鎖的并行執(zhí)行機(jī)制和加鎖順序執(zhí)行機(jī)制結(jié)合來進(jìn)行多線程軟件的處理。本領(lǐng)域的技術(shù)人員可以理解,可以在硬件上、操作系統(tǒng)中或應(yīng)用程序中設(shè)置鎖的保護(hù)范圍或作用域。如已有技術(shù)中,通過設(shè)置讀鎖rLock:ReadLock和寫鎖wLock:WrUeLock的保護(hù)范圍或作用域,4吏得持有讀鎖的操作可以并行執(zhí)行讀取操作,而持有寫鎖的操作可以排他性地執(zhí)行其操作。本領(lǐng)域的技術(shù)人員可以理解,可以采取與已有技術(shù)類似的方法,在硬件上、操作系統(tǒng)中或應(yīng)用程序中設(shè)置弱鎖和強(qiáng)鎖的保護(hù)范圍或作用域,使得持有弱鎖的多個(gè)操作可以并行執(zhí)行其操作,而持有強(qiáng)鎖的一操作排他性地執(zhí)行其操作。如在上述例3中,通過設(shè)置弱鎖wLock:WeakLock和強(qiáng)鎖sLock:StrongLock的保護(hù)范圍或作用域,使得持有弱鎖的多個(gè)操作可以并行地執(zhí)行其操作,而持有強(qiáng)鎖一操作則排他性地執(zhí)行其操作。在這種情況下,多線程程序或進(jìn)程的可擴(kuò)展性、魯棒性或容易開發(fā)性,可以通過進(jìn)一步的機(jī)制來確保。圖3示出了根據(jù)本發(fā)明一實(shí)施例的用于數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法。在步驟S100,開始該方法。在步驟S110,將對it據(jù)結(jié)構(gòu)的一實(shí)例的操作劃分為可無鎖'的才乘4乍(lock—freecapableoperation)和不應(yīng)無4貞的才喿4乍(lock-freeincapableoperation)。如下文所述,可以采用多種方式將對凄t據(jù)結(jié)構(gòu)的一實(shí)例的操作劃分為可無鎖的操作和不應(yīng)無鎖的操作。本領(lǐng)域的技術(shù)人員可以理解,該步驟的實(shí)施可以由軟件的開發(fā)工具或程序的執(zhí)行環(huán)境來實(shí)施,而獨(dú)立于其它步驟S120-S160。此外,如上文所述可以程序之中,或程序的^l行環(huán)境中(如上文所述的在硬件上、操作系統(tǒng)中或應(yīng)用程序中)設(shè)置鎖的作用方式。其中,允許有多個(gè)操作/線程同時(shí)分別持有第一鎖的多個(gè)弱鎖,只允許一個(gè)操作/線程持有第一鎖的強(qiáng)鎖,不允許第一鎖的弱鎖和強(qiáng)鎖同時(shí)^皮持有;其中,持有所述第一鎖的弱鎖的多個(gè)可無鎖的操作并行執(zhí)行。其中,一可無鎖的操作所執(zhí)行的操作可以包括寫操作。亦即,根據(jù)本發(fā)明的一實(shí)施例,允許有的可無鎖的操作只包括讀操作而有的可無鎖的操作包括寫操作。另,在本發(fā)明的上述描述中使用的術(shù)語"第一鎖"的實(shí)質(zhì)含義是指一鎖,使用"第一"是為了指代的需要。如文中使用"該第一鎖"指代前述的"第一鎖",以避免在相應(yīng)的上下文中使用"該鎖"時(shí)不易指明是指代前述的"一鎖"還是指代前述的"弱鎖"等。在步驟S120,為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作。如果其它操作已經(jīng)持有該第一鎖的弱鎖,則允許該至少一可無鎖的操作獲取該第一鎖的另一弱鎖。如果其它操作已經(jīng)持有該第一鎖的強(qiáng)鎖,則該至少一可無鎖的操作將被阻塞,直至該強(qiáng)鎖被釋放為止。本領(lǐng)域的技術(shù)人員可以理解,根據(jù)本發(fā)明實(shí)施例的鎖的使用方法,還可以與其它鎖的分配機(jī)制相結(jié)合,如與根據(jù)優(yōu)先級來分配鎖的機(jī)制相結(jié)合,等等。在步驟S130,響應(yīng)于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該可無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。根據(jù)本發(fā)明的一實(shí)施例,允許有的可無鎖的操作只進(jìn)行讀操作而有的可無鎖的操作進(jìn)行寫操作。根據(jù)本發(fā)明的另一12實(shí)施例該方法還可以進(jìn)一步包括響應(yīng)于該可無鎖的才喿作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的纟喿作,釋放該弱鎖。在步驟S140,為一不應(yīng)無鎖的操作請求獲取所述第一鎖的強(qiáng)鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作。如果其它操作已經(jīng)持有該第一鎖的弱鎖或強(qiáng)鎖,則該不應(yīng)無鎖的操作將被阻塞,直至該弱鎖或強(qiáng)鎖被釋放為止。在步驟150,響應(yīng)于該不應(yīng)無鎖的操作完成獲取該強(qiáng)鎖,執(zhí)行該不應(yīng)無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。根據(jù)本發(fā)明的另一實(shí)施例該方法還可以進(jìn)一步包括響應(yīng)于該不能無鎖的操作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該強(qiáng)鎖。在步驟160,該方法結(jié)束。本領(lǐng)域的技術(shù)人員可以理解,步驟S120-S160本身已經(jīng)構(gòu)成了一個(gè)完整的技術(shù)方案,而直接在相應(yīng)的具有上述強(qiáng)鎖和弱鎖的運(yùn)行環(huán)境或工具軟件上實(shí)施。一數(shù)據(jù)結(jié)構(gòu)的一實(shí)例,是指一種數(shù)據(jù)結(jié)構(gòu)的具體實(shí)施對象。鏈表是一種常用的數(shù)據(jù)結(jié)構(gòu),其它常用的數(shù)據(jù)結(jié)構(gòu)還包括順序表、樹、圖、跳表等等。"鏈表"是一個(gè)鏈表結(jié)構(gòu),鏈表中的每個(gè)節(jié)點(diǎn)都含有指向下一個(gè)節(jié)點(diǎn)的指針。數(shù)據(jù)結(jié)構(gòu)"鏈表"的操作通常有增加元素,刪除元素,查詢元素,遍歷元素,排序。在本發(fā)明的實(shí)施例中對一鏈表的實(shí)例list進(jìn)行舉例說明,該list中包括多個(gè)元素。根據(jù)本發(fā)明的一實(shí)施例,可以使用強(qiáng)鎖和弱鎖來保護(hù)List類。通過設(shè)置弱鎖和強(qiáng)鎖的保護(hù)范圍或作用域,使得持有弱鎖的多個(gè)操作可以并行地執(zhí)行其操作,而持有強(qiáng)鎖一操作則排他性地執(zhí)行其操作。對于可無鎖的操:作add()和remove(),可以使用弱鎖以便多個(gè)可無鎖的操作可以并行執(zhí)行。對于不應(yīng)無鎖的操作使用一強(qiáng)鎖,來排他性地訪問List,阻塞其它操作對于List的訪問。下面舉例說明可無鎖的操作和不應(yīng)無鎖的操作。在下述實(shí)施例中,操作add是可無鎖的操作,操作remove是可無鎖的操作,而操作sort是不應(yīng)無鎖的操作。操作add獲取針對List的弱鎖之后,操作remove依然可以獲取針對List的弱鎖。因此,操作add和操作remove可以并行執(zhí)行。操作sort不能與操作add或操作remove并行執(zhí)行。classIist{privateLockweaklock,stronglock;publicList(){WeakStrongLockwslock=newWeakStrongLock();weaklock=wslock.weaklock();stronglock=wslock.stronglock();義List類,然后privateLockweaklock,stronglock為針對該List類的操作定義一鎖。在該程序被初始化時(shí)將派生一鎖WeakStrongLockwslock=newWeakStrongLock(),該鎖包括一個(gè)或多個(gè)弱鎖weaklock=wslock.weaklock()和一個(gè)強(qiáng)鎖stronglock=wslock.stronglock()。publicvoidadd(Objectobj){try{weaklock.lock();〃dothelock-freeaddJfinally{weaklock.unlock();在上述程序中,將對象obj加入List的操作add,可以由一個(gè)或多個(gè)原子操作組成。因此,操作add是可無鎖的操作。在執(zhí)行時(shí),首先使用weaklock.lock()請求弱鎖。獲取弱鎖之后,執(zhí)行可無鎖的操作add,將對象obj加入List;執(zhí)行完成后,weaklock,unlock()釋放弱鎖。如果該鎖的強(qiáng)鎖被其它的操作或線程持有,add操作將被阻塞。然后,在該鎖的強(qiáng)鎖被釋放后,該add搡作才能獲取所請求的弱鎖。publicvoidremove(Objectobj){try{weaklock.lock();〃dothelock-freeremove}fmally{weaklock.unlock();在上述程序中,將對象obj從List刪除的操作remove,可以由一個(gè)或多個(gè)原子操作組成。因此,操作remove是可無鎖的操作。在執(zhí)行時(shí),首先使用weaklock.lock()請求弱鎖,獲取弱鎖之后,執(zhí)行可無鎖的l喿作remove;執(zhí)行完成后,weaklock.unlock()釋放弱鎖。如果該鎖的強(qiáng)鎖;故其它的操作或線程持有,則該remove操作將被阻塞。然后,在該鎖的強(qiáng)鎖被釋放后,該remove操作才能獲取所請求的弱鎖。但是,如果該鎖的一弱鎖被其它的操作或線程持有,則該14remove操作可以獲取該鎖的另一弱鎖。publicvoidsort(){try{stronglock.lock();〃dosorting}fmally{stronglock.unlock();在上述程序中,將類List的對象obj排序的操作sort,不能分解為一個(gè)或多個(gè)原子操作。其所需的原子操作數(shù)量將隨著List中元素?cái)?shù)量變化而變化。因此,操作sort是不應(yīng)無鎖的操作。在執(zhí)行時(shí),首先使用stronglock.lock()請求強(qiáng)鎖,獲取強(qiáng)鎖之后,執(zhí)行不應(yīng)無鎖的操作sort;執(zhí)行完成后,stronglock.unlock()釋放強(qiáng)鎖。如果該鎖的強(qiáng)鎖或弱鎖被其它的操作或線程持有,則該sort操作將被阻塞。然后,在該鎖的強(qiáng)鎖或弱鎖其它操作或線程被釋放后,該sort操作才能獲取所請求的強(qiáng)鎖。上述圖3的方法中,步驟S110將對數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作劃分為可無鎖的操作和不應(yīng)無鎖的操作可以采用多種方法來進(jìn)行。才艮據(jù)本發(fā)明的一實(shí)施例,如果一個(gè)操作的無鎖算法需要的原子操作的數(shù)目是一個(gè)常數(shù),則將該纟喿作劃分為可無鎖的操作;如果一個(gè)^喿作的無鎖算法需要的原子操作的數(shù)目不是一個(gè)常數(shù),則將該操作劃分為不應(yīng)無鎖的操作。在本發(fā)明的進(jìn)一步實(shí)施例中,如果一個(gè)操作的無鎖算法需要的原子操作的數(shù)目是一個(gè)常數(shù),并且該常數(shù)與數(shù)據(jù)結(jié)構(gòu)的實(shí)例中元素的數(shù)目不相關(guān),則將該操作劃分為可無鎖的操作;如果一個(gè)操作的無鎖算法需要的原子操作的數(shù)目不是一個(gè)常數(shù),該數(shù)目與數(shù)據(jù)結(jié)構(gòu)的實(shí)例中元素的數(shù)目相關(guān),則將該操作劃分為不應(yīng)無鎖的操作。其中,可無鎖的操作對數(shù)據(jù)結(jié)構(gòu)的實(shí)例的才喿作可以分解為由預(yù)定數(shù)量的原子操作組成的操作。優(yōu)選地,可無鎖的操作對數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作可以分解為由l-5個(gè)原子操作組成的操作。其中,不應(yīng)無鎖的操作對數(shù)據(jù)結(jié)構(gòu)的實(shí)例的一操作,不能分解為由一個(gè)或多個(gè)原子操作組成的操作。如上述處理List的例子中,元素的添加#:作只需要一個(gè)原子操作,而元素的刪除操作只需要一個(gè)或兩個(gè)原子操作。因此,這兩種操作可以劃分為可無鎖的操作。而List的排序操作和數(shù)據(jù)結(jié)構(gòu)中的元素?cái)?shù)目相關(guān),因而屬于不應(yīng)無鎖才喿作。再如,在堆?;虺鰲?pushorpopinstack)可以劃分為可無鎖的搮:作;而為圖形加邊框的操作應(yīng)劃分為不應(yīng)無鎖操:作。在本發(fā)明之前的已有技術(shù)中,對于基于鎖的方法都用鎖保護(hù)。這樣數(shù)據(jù)結(jié)構(gòu)是安全的,但是可擴(kuò)展性較低。而如果數(shù)據(jù)結(jié)構(gòu)中的部分操作是無鎖而且是多線程安全的,例如List的add()和remove()方法。而其他操:作不是多線程安全的,如List的sort()方法。這樣數(shù)據(jù)結(jié)構(gòu)的使用將相當(dāng)受限。程序員使用非線程安全的方法需要非常小心,必須等待直到一個(gè)安全的時(shí)間,并在這個(gè)安全的時(shí)間之內(nèi)調(diào)用非線程安全的方法。這種方式需要程序員過多的介入,不管是開發(fā)效率還是執(zhí)行效率都受到影響。根據(jù)本發(fā)明的另一實(shí)施例,如果一個(gè)操作需要修改的內(nèi)存單元的數(shù)目是一個(gè)常數(shù),則將該操作劃分為可無鎖的操作;如果一個(gè)操作的需要修改的內(nèi)存單元的數(shù)目不是常數(shù),則將該操作劃分為不應(yīng)無鎖操作。根據(jù)本發(fā)明的進(jìn)一步實(shí)施例,可無鎖的操作需要修改的內(nèi)存單元的數(shù)目與數(shù)據(jù)結(jié)構(gòu)中元素的數(shù)目不相關(guān),不應(yīng)無鎖才喿作需要修改的內(nèi)存單元的數(shù)目與數(shù)據(jù)結(jié)構(gòu)的實(shí)例中元素?cái)?shù)目相關(guān)。優(yōu)選地,可無鎖的操作的內(nèi)存單元訪問少于一個(gè)字或者一個(gè)雙字;不應(yīng)無鎖操作的內(nèi)存單元訪問多于一個(gè)雙字或兩個(gè)不連續(xù)的字。對于上述處理List的例子,元素的添加操作只需要修改原List中的一個(gè)指針變量,List的刪除操作只需要修改List中一個(gè)或兩個(gè)指針變量。因此,這兩種搡作被劃分為可無鎖的操作。而List的排序操作需要修改的指針數(shù)量正比于List中的元素?cái)?shù)目,因而屬于不應(yīng)無鎖搡作。根據(jù)本發(fā)明的另一實(shí)施例,在單線程執(zhí)行時(shí),對于同一個(gè)數(shù)據(jù)結(jié)構(gòu)實(shí)例的每一個(gè)操作,如果以無鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率,與基于鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率相差小于預(yù)定的值,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應(yīng)無鎖的操作。優(yōu)選地,在單線程執(zhí)行時(shí),如果對于同一個(gè)數(shù)據(jù)結(jié)構(gòu)實(shí)例的每一個(gè)#:作,以無鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率,與基于鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率相差小于1.5倍,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應(yīng)無鎖的操作。對于同一個(gè)凝:據(jù)結(jié)構(gòu)的每一個(gè)操作都可以實(shí)現(xiàn)兩個(gè)版本,一個(gè)為無鎖實(shí)現(xiàn),令一個(gè)為基于鎖的實(shí)現(xiàn)。在上述處理List的例子中,元素的添加操作和刪除操作的效率和基于鎖的實(shí)現(xiàn)差不多。所以劃分為可無鎖操作。而List的排序操作的無鎖實(shí)現(xiàn)相當(dāng)?shù)托В詣澐譃椴粦?yīng)無鎖操作。此外,為圖形加邊框的操作,如果采用無鎖的方式,效率也非常低。才艮據(jù)本發(fā)明的另一實(shí)施例,在圖3所示的方法中,允許有多個(gè)操作/線程同時(shí)分別持有第一鎖的多個(gè)弱鎖,只允許一個(gè)操作/線程持有第一鎖的強(qiáng)鎖,不允許第一鎖的弱鎖和強(qiáng)鎖同時(shí)4皮持有;其中,持有所述第一鎖的弱鎖的多個(gè)可無鎖的操作并行執(zhí)行。其中,圖3所示的方法進(jìn)一步包括響應(yīng)于該可無鎖的操作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該弱鎖;響應(yīng)于該不能無鎖的操作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該強(qiáng)鎖。圖4a和圖4b示出了根據(jù)本發(fā)明一實(shí)施例的操作執(zhí)行情況。在圖4a中,兩個(gè)或多個(gè)可無鎖的才喿作被并行執(zhí)行,此時(shí),一個(gè)或多個(gè)不應(yīng)無鎖的操作被阻塞。如圖4a中所示的操作add()和remove()等操作被并行執(zhí)行,此時(shí)不應(yīng)無鎖的操作size()等被阻塞。在圖4b中,一個(gè)或多個(gè)不應(yīng)無鎖的操作被順序執(zhí)行,此時(shí),其它不應(yīng)無鎖的操作以及可無鎖的操作被阻塞。如圖4b中所示的操作size()等操作被順序執(zhí)行,此時(shí)其他不應(yīng)無鎖的操作以及可無鎖的操作add()和remove()等被阻塞。在本發(fā)明之前的已有技術(shù)中,無鎖的方法具有多種優(yōu)點(diǎn),但是卻難以開發(fā)。因此,無鎖機(jī)制經(jīng)常被用于簡單的操作。例如,參見以下采用已有技術(shù)對于一數(shù)據(jù)結(jié)構(gòu)的實(shí)例-鏈表List類一的操作。classList(publicvoidadd(Objectobj);publicvoidremove(Objectobj);publicvoidsort();}將無鎖機(jī)制用于add()和remove()方法并不難。add()用于增加一元素,publicvoidadd(Objectobj)表示為List類增加一對象元素,并且該List的add可以被其它線程的操作訪問。remove()用于刪除一元素,publicvoidremove(Objectobj)表示為List類刪除一對象元素,并且該List的remove可以被其它線程的操作訪問。sort()用于對元素進(jìn)行排序操作,publicvoidsort()表示將List的對象元素進(jìn)行排序,并且該List的sort可以被其它線程的操作訪問。但是,將無鎖機(jī)制用于sort()方法就很難。原因數(shù)據(jù)結(jié)構(gòu)實(shí)例List—般包括多個(gè)元素。這樣,在執(zhí)行List元素排序操作的過程中,如果其它線程對List的對象元素進(jìn)行增加或刪除操作,將引起沖突。因此,自然的方法是使用鎖來保護(hù)sort()。這樣,重寫后的代碼如下。classList{publicvoidadd(Objectobj);publicvoidremove(Objectobj);publicsynchronizedvoidsort();publicsynchronizedvoidsort()表示在sort執(zhí)行時(shí)需要力口鎖和釋放鎖(lockunlockpair)的操作。在此,將sort()修改為同步的方法,在執(zhí)行時(shí),首先嘗試獲取一鎖;在獲取鎖之后,執(zhí)行排序操作;在排序操作完成后,釋放該鎖。這樣,在任何時(shí)候只有一個(gè)線程被允許進(jìn)入該方法調(diào)用sort。但是,上述方法并非正確。如果一個(gè)線程進(jìn)入sort()方法,這時(shí)另一個(gè)線程使用remove()方法來刪除一個(gè)節(jié)點(diǎn),sort方法將可能失效。因?yàn)?,add()方法可能在某個(gè)時(shí)刻與sort()方法交叉。并且,盡管sort()方法加鎖;但是,add是無鎖的。這就允許add在任何時(shí)刻都可以執(zhí)行,從而由可能產(chǎn)生沖突。因此,安全的版本將采用如下方式,其中對所有操作采取同步(或加鎖)的方式進(jìn)行。classList{publicsynchronizedvoidadd(Objectobj);publicsynchronizedvoidremove(Objectobj);publicsynchronizedvoidsort();}publicsynchronizedvoidadd(Objectobj)表示在add執(zhí)行時(shí)需要力口鎖和釋放鎖(lockunlockpair)的操作。publicsynchronizedvoidremove(Objectobj)表示在remove執(zhí)行時(shí)需要加鎖和釋放鎖(lockunlockpair)的操作。現(xiàn)在,得到了安全的List。但是,其中的全部三個(gè)方法都使用鎖來保護(hù)。這樣,如圖1和圖2所示,在任何時(shí)刻,只允許一個(gè)線程進(jìn)入上述三個(gè)方法之一。在圖1中,簡單操作獲取一個(gè)互斥鎖,并阻止其它操作獲取該互斥鎖。在圖2中,復(fù)雜操作獲取一個(gè)互斥鎖,并阻止其它操作獲取該互斥鎖。這種方式妨礙了軟件并行執(zhí)行。圖5a和圖5b示出了與本發(fā)明實(shí)施例相對比根據(jù)已有技術(shù)的一實(shí)施例的操作執(zhí)行情況。該已有技術(shù)采用加鎖操作。在圖5a中,由于add()需要執(zhí)行寫操作,而并非單純的讀操作,因此,得到鎖的操作add()被執(zhí)行時(shí),其它的操作將被阻塞。在圖5b中,由于size()需要執(zhí)行寫操作,而并非單純的讀操作,因此,得到鎖的操作size()被執(zhí)行時(shí),其它的操作將被阻塞。與上述一種對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法相對應(yīng),本發(fā)明還提供了一種對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的系統(tǒng),包括弱鎖裝置,用于為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;可18無鎖的操作執(zhí)行裝置,用于響應(yīng)于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作;強(qiáng)鎖裝置,用于為一不應(yīng)無鎖的操作請求獲取所述第一鎖的強(qiáng)鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;以及不應(yīng)無鎖的操作執(zhí)行裝置,用于響應(yīng)于該不應(yīng)無鎖的操作完成獲取該強(qiáng)鎖,執(zhí)行該不應(yīng)無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。其中,弱鎖裝置和強(qiáng)鎖裝置進(jìn)一步配置為允許有多個(gè)操作同時(shí)分別持有該第一鎖的多個(gè)弱鎖,只允許一個(gè)^J喿作持有該第一鎖的強(qiáng)鎖,不允許該第一鎖的弱鎖和強(qiáng)鎖同時(shí)被持有;可無鎖的操作執(zhí)行裝置配置為允許持有該第一鎖的弱鎖的多個(gè)可無鎖的操作并行執(zhí)行。其中,上述系統(tǒng)進(jìn)一步包括阻塞裝置,該阻塞裝置配置為響應(yīng)于執(zhí)行該不應(yīng)無鎖的操作,阻塞請求該第一鎖的強(qiáng)鎖的操作;響應(yīng)于執(zhí)行該不應(yīng)無鎖的^操作,阻塞請求該第一鎖的弱鎖的操作或其它請求該第一鎖的強(qiáng)鎖的才喿作。其中,所述弱鎖裝置進(jìn)一步配置為響應(yīng)于該可無鎖的操:作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該弱鎖;所述強(qiáng)鎖裝置進(jìn)一步配置為響應(yīng)于該不能無鎖的操作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該強(qiáng)鎖。其中,可無鎖的操作所執(zhí)行的操作可以包括寫操作。其中,上述系統(tǒng)進(jìn)一步包括操作劃分裝置,用于將對數(shù)據(jù)結(jié)構(gòu)的一實(shí)例的操作劃分為可無鎖的操作和不應(yīng)無鎖的操作。操作劃分裝置可以進(jìn)一步配置為使用根據(jù)上文所述的多種方法的一種或多種,將對數(shù)據(jù)結(jié)構(gòu)的一實(shí)例的操作劃分為可無鎖的操作和不應(yīng)無鎖的操作。與已有技術(shù)相比,本發(fā)明將基于鎖的方法和無鎖的方法的并行處理進(jìn)行整合。如上文所述,無鎖的代碼并行執(zhí)行可擴(kuò)展性好,但是難以編程。與此相反,基于鎖的方法可擴(kuò)展性差,但是卻容易理解和編程。當(dāng)多個(gè)可無鎖的操作在多個(gè)線程中并行執(zhí)行時(shí),可無鎖的操作能夠確保原子操作特性和共享變量的一致狀態(tài)。當(dāng)一個(gè)不應(yīng)無鎖的操作與其它不應(yīng)無鎖操作或可無鎖操作需要執(zhí)行時(shí),用一個(gè)強(qiáng)鎖來確保原子操作特性和共享變量的一致狀態(tài)。根據(jù)本發(fā)明的一個(gè)實(shí)施例,當(dāng)只有簡單的方法而沒有復(fù)雜操作執(zhí)行時(shí),可無鎖操作就可以并行執(zhí)行。可以針對全部數(shù)據(jù)結(jié)構(gòu)安全地并行執(zhí)行操作。當(dāng)復(fù)雜方法執(zhí)行時(shí),仍然可以利用強(qiáng)鎖來針對全部數(shù)據(jù)結(jié)構(gòu)安全地執(zhí)行線程??蔁o鎖操作不會(huì)受到不必要的阻止。本發(fā)明還提供了一種存儲(chǔ)介質(zhì)或信號載體,其中包括用于執(zhí)行根據(jù)本發(fā)明的方法的指令。以上結(jié)合優(yōu)選法方案對本發(fā)明進(jìn)行了詳細(xì)的描述,但是可以理解,以上實(shí)施例僅用于說明而非限定本發(fā)明。本領(lǐng)域的技術(shù)人員可以對本發(fā)明的所示方案進(jìn)行修改而不脫離本發(fā)明的范圍和精神。權(quán)利要求1.一種對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法,包括為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;響應(yīng)于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作;為一不應(yīng)無鎖的操作請求獲取所述第一鎖的強(qiáng)鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;以及響應(yīng)于該不應(yīng)無鎖的操作完成獲取該強(qiáng)鎖,執(zhí)行該不應(yīng)無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。2.根據(jù)權(quán)利要求l所述的方法,其中,允許有多個(gè)操作同時(shí)分別持有該第一鎖的多個(gè)弱鎖,只允許一個(gè)操作持有該第一鎖的強(qiáng)鎖,不允許該第一鎖的弱鎖和強(qiáng)鎖同時(shí)被持有;其中,持有該第一鎖的弱鎖的多個(gè)可無鎖的操作并行執(zhí)行。3.根據(jù)權(quán)利要求2所述的方法,其中進(jìn)一步包括響應(yīng)于執(zhí)行該不應(yīng)無鎖的操作,阻塞請求該第一鎖的強(qiáng)鎖的操作;響應(yīng)于執(zhí)行該不應(yīng)無鎖的操作,阻塞請求該第一鎖的弱鎖的操作或其它請求該第一鎖的強(qiáng)鎖的操作。4.根據(jù)權(quán)利要求l所述的方法,其中進(jìn)一步包括響應(yīng)于該可無鎖的操作完成對該it據(jù)結(jié)構(gòu)的實(shí)例的l喿作,釋^i亥弱鎖;響應(yīng)于該不能無鎖的操作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該強(qiáng)鎖。5.根據(jù)權(quán)利要求1所述的方法,其中可無鎖的操作所執(zhí)行的操作可以包括寫操作。6.根據(jù)權(quán)利要求l所述的方法,其中進(jìn)一步包括將對數(shù)據(jù)結(jié)構(gòu)的一實(shí)例的操作劃分為可無鎖的操作和不應(yīng)無鎖的操作。7.根據(jù)權(quán)利要求1至6任一項(xiàng)所述的方法,其中,如果一個(gè)操作的無鎖算法需要的原子操作的數(shù)目是一個(gè)常數(shù),則將該操作劃分為可無鎖的操作;如果一個(gè)操作的無鎖算法需要的原子操作的數(shù)目不是一個(gè)常數(shù),則將該操作劃分為不應(yīng)無鎖的操作。8.根據(jù)權(quán)利要求7所述的方法,其中,如果一個(gè)操作的無鎖算法需要的原子才喿作的數(shù)目是一個(gè)常數(shù),并且該常數(shù)與數(shù)據(jù)結(jié)構(gòu)的實(shí)例中元素的數(shù)目不相關(guān),則將該操作劃分為可無鎖的操作;如果一個(gè)操作的無鎖算法需要的原子操作的數(shù)目不是一個(gè)常數(shù),該數(shù)目與數(shù)據(jù)結(jié)構(gòu)的實(shí)例中元素的數(shù)目相關(guān),則將該操作劃分為不應(yīng)無鎖的操作。9.根據(jù)權(quán)利要求7所述的方法,其中,可無鎖的操作對數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作可以分解為由預(yù)定數(shù)量的原子操作組成的操作。10.根據(jù)權(quán)利要求7所述的方法,其中,可無鎖的操作對數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作可以分解為由l-5個(gè)原子操作組成的操作。11.根據(jù)權(quán)利要求1至6任一項(xiàng)所述的方法,其中,如果一個(gè)操作需要修改的內(nèi)存單元的數(shù)目是一個(gè)常數(shù),則將該操作劃分為可無鎖的操作;如果一個(gè)操作的需要修改的內(nèi)存單元的數(shù)目不是常數(shù),則將該操作劃分為不應(yīng)無鎖操作。12.根據(jù)權(quán)利要求11所述的方法,其中,可無鎖的操作需要修改的內(nèi)存單元的數(shù)目與數(shù)據(jù)結(jié)構(gòu)中元素的數(shù)目不相關(guān),不應(yīng)無鎖操作需要修改的內(nèi)存單元的數(shù)目與數(shù)據(jù)結(jié)構(gòu)的實(shí)例中元素?cái)?shù)目相關(guān)。13.根據(jù)權(quán)利要求11所述的方法,其中,可無鎖的操作的內(nèi)存單元訪問少于一個(gè)字或者一個(gè)雙字;不應(yīng)無鎖操作的內(nèi)存單元訪問多于一個(gè)雙字或兩個(gè)不連續(xù)的字。14.根據(jù)權(quán)利要求1至6任一項(xiàng)所述的方法,其中,在單線程執(zhí)行時(shí),對于同一個(gè)數(shù)據(jù)結(jié)構(gòu)實(shí)例的每一個(gè)操作,如果以無鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率,與基于鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率相差小于預(yù)定的值,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應(yīng)無鎖的操作。15.根據(jù)權(quán)利要求14所述的方法,其中,在單線程執(zhí)行時(shí),如果對于同一個(gè)數(shù)據(jù)結(jié)構(gòu)實(shí)例的每一個(gè)操作,如果以無鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率,與基于鎖的方式實(shí)現(xiàn)時(shí)的執(zhí)行效率相差小于1,5倍,則將該操作劃分為可無鎖的操作;否則,將該操作劃分為不應(yīng)無鎖的操作。16.—種對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的系統(tǒng),包括弱鎖裝置,用于為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;可無鎖的操作執(zhí)行裝置,用于響應(yīng)于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作;強(qiáng)鎖裝置,用于為一不應(yīng)無鎖的操作請求獲取所述第一鎖的強(qiáng)鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作;以及不應(yīng)無鎖的操作執(zhí)行裝置,用于響應(yīng)于該不應(yīng)無鎖的操作完成獲取該強(qiáng)鎖,執(zhí)行該不應(yīng)無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。17.根據(jù)權(quán)利要求16所述的系統(tǒng),其中,弱鎖裝置和強(qiáng)鎖裝置進(jìn)一步配置為允許有多個(gè)操作同時(shí)分別持有該第一鎖的多個(gè)弱鎖,只允許一個(gè)操作持有該第一鎖的強(qiáng)鎖,不允許該第一鎖的弱鎖和強(qiáng)鎖同時(shí)被持有;可無鎖的操作執(zhí)行裝置進(jìn)一步配置為允許持有該第一鎖的弱鎖的多個(gè)可無鎖的操作并行執(zhí)行。18.根據(jù)權(quán)利要求17所述的系統(tǒng),其中進(jìn)一步包括阻塞裝置,該阻塞裝置配置為響應(yīng)于執(zhí)行該不應(yīng)無鎖的操作,阻塞請求該第一鎖的強(qiáng)鎖的操作;響應(yīng)于執(zhí)行該不應(yīng)無鎖的操作,阻塞請求該第一鎖的弱鎖的操作或其它請求該第一鎖的強(qiáng)鎖的操作。19.根據(jù)權(quán)利要求16所述的系統(tǒng),其中所述弱鎖裝置進(jìn)一步配置為響應(yīng)于該可無鎖的操作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該弱鎖;所述強(qiáng)鎖裝置進(jìn)一步配置為響應(yīng)于該不能無鎖的操作完成對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例的操作,釋放該強(qiáng)鎖。20.根據(jù)權(quán)利要求16所述的系統(tǒng),其中可無鎖的操作所執(zhí)行的操作可以包括寫操作。21.根據(jù)權(quán)利要求16所述的系統(tǒng),其中進(jìn)一步包括操作劃分裝置,用于將對數(shù)據(jù)結(jié)構(gòu)的一實(shí)例的操作劃分為可無鎖的操作和不應(yīng)無鎖的操作。22.根據(jù)權(quán)利要求21所述的系統(tǒng),其中操作劃分裝置進(jìn)一步配置為使用根據(jù)方法權(quán)利要求7-15所述的方法的一種或多種,將對數(shù)據(jù)結(jié)構(gòu)的一實(shí)例的操作劃分為可無鎖的操作和不應(yīng)無鎖的操作。全文摘要本發(fā)明提供了一種對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的方法和系統(tǒng)。該方法包括為至少一可無鎖的操作請求獲取一第一鎖的弱鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作。響應(yīng)于該至少一可無鎖的操作完成獲取弱鎖,執(zhí)行該至少一可無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。為一不應(yīng)無鎖的操作請求獲取所述第一鎖的強(qiáng)鎖,以便對該數(shù)據(jù)結(jié)構(gòu)的所述實(shí)例進(jìn)行操作。響應(yīng)于該不應(yīng)無鎖的操作完成獲取該強(qiáng)鎖,執(zhí)行該不應(yīng)無鎖的操作對該數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行的操作。根據(jù)本發(fā)明的上述方法和系統(tǒng)可以提高對數(shù)據(jù)結(jié)構(gòu)的實(shí)例進(jìn)行操作的效率。文檔編號G06F9/46GK101685406SQ20081014982公開日2010年3月31日申請日期2008年9月27日優(yōu)先權(quán)日2008年9月27日發(fā)明者戴曉君,王遠(yuǎn)洪,志甘,邱模炯,堯齊申請人:國際商業(yè)機(jī)器公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1