国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種跨進程的線程間進行互斥的方法

      文檔序號:9750650閱讀:517來源:國知局
      一種跨進程的線程間進行互斥的方法
      【技術(shù)領(lǐng)域】
      [0001]本發(fā)明涉及信息處理技術(shù)領(lǐng)域,尤其涉及一種跨進程的線程間進行互斥的方法。
      【背景技術(shù)】
      [0002]現(xiàn)代操作系統(tǒng)采用多道程序設(shè)計機制,多個進程可以并發(fā)執(zhí)行,每個進程下又包含有多個線程,CPU在線程之間來回切換,共享某些資源,提高了資源的利用率,但這也使得處理并發(fā)執(zhí)行的多個線程之間的沖突和相互制約關(guān)系成為了一道難題。如果對并發(fā)線程的調(diào)度不當(dāng),則可能會出現(xiàn)運行結(jié)果與切換時間有關(guān)的情況,令結(jié)果不可再現(xiàn),影響系統(tǒng)的效率和正確性,嚴重時還會使系統(tǒng)直接崩潰。需要一些機制來控制并發(fā)線程間的這種相互制約關(guān)系。
      [0003]線程間通常存在著兩種制約關(guān)系:直接制約關(guān)系和間接制約關(guān)系。所謂直接制約關(guān)系,指的是多個線程利用一些共享的資源相互合作,完成某些事情,但是其中某個線程做一件事前,可能要等待另外一個線程完成另外一件事,是一種源于相互合作的直接制約關(guān)系。而間接制約關(guān)系,指的是一個線程在使用共享的資源時,另外一個線程不允許使用,是一種源于資源共享的間接制約關(guān)系。在信息技術(shù)領(lǐng)域中,前者被稱為線程同步,后者被稱為線程互斥。
      [0004]在Linux中,有一些資源是共享的,但是這些資源一次只能提供給一個線程使用,我們稱這些資源為臨界資源。在使用臨界資源的時候,如果不加以互斥訪問控制,就會出現(xiàn)非預(yù)期的結(jié)果。在源代碼中,訪問臨界資源的的代碼段被稱作為臨界區(qū),當(dāng)有線程進入臨界區(qū)時,其他線程必須等待,以確保這些臨界資源是被互斥獲得使用的?;コ庑畔⒌淖饔镁拖喈?dāng)于一扇門配一把鎖,任何一個線程在進入臨界區(qū)之前需要對互斥信息進行加鎖操作,成功獲得鎖的線程可以成功通過“門”進入臨界區(qū),其他線程則必須在“門”外等待,直到進入獲得鎖的線程從“門”內(nèi)出來釋放鎖,之后其它線程再次競爭鎖重復(fù)上述過程。
      [0005]根據(jù)需要互斥的線程的關(guān)系,線程互斥分為進程內(nèi)的線程互斥和跨進程的線程互斥兩種。
      [0006]進程內(nèi)的線程互斥,指的是需要互斥的線程都是在一個進程內(nèi),因為進程內(nèi)的全局數(shù)據(jù)資源是可以被所有線程共享的,這種情況下,只需要在進程設(shè)置一個全局的互斥信息即可用于所有線程的互斥。
      [0007]跨進程的線程互斥,指的是需要互斥的線程是在不同進程內(nèi)。不同于在單個進程內(nèi)的多個線程之間實施互斥訪問,跨進程的線程之間的互斥會有更多的問題需要考慮和解決。因為互斥信息用于不同進程之間,并且我們知道某個進程對其他進程的內(nèi)部情況是不可見的,所以在單個進程內(nèi)部設(shè)置一個全局變量無法滿足要求,此時,需要將互斥信息放到一個對所有用戶進程可見的區(qū)域內(nèi),這樣就滿足了所有線程均可使用同一個互斥信息的要求,比較常用的方法有兩種,一種是將互斥信息保存到操作系統(tǒng)的共享內(nèi)存中,另一種則是將互斥信息保存到操作系統(tǒng)的文件中。
      [0008]但是,當(dāng)一個進程內(nèi)的線程使用完了互斥信息之后,它不知道是該刪除互斥信息還是繼續(xù)保留互斥信息。假如有兩個進程,我們記為Pl和P2,在Pl內(nèi)有線程Tl,P2內(nèi)有線程T2。如果Tl在使用完了互斥信息之后將其刪除,而在刪除之前T2中已經(jīng)取得了互斥信息的句柄,只是準備使用而未使用,那么Tl刪除了互斥信息之后T2再使用互斥信息,就會發(fā)生不可預(yù)知的錯誤;如果Tl在使用完了互斥信息之后未將其刪除,而此時已經(jīng)沒有任何進程使用互斥信息了,那么就會留下垃圾值。除了互斥信息是否需要保留的問題,在使用過程中還會遇到進程或線程中途崩潰退出的情況,此時,對互斥信息的不完整操作,導(dǎo)致遺留的互斥信息中的數(shù)據(jù)值是無效的垃圾值,對垃圾值的處理也是一個需要解決的問題。另外,一個線程在進行加鎖操作時,假如它已經(jīng)獲得鎖,它不應(yīng)當(dāng)出現(xiàn)向自身等待鎖的情況,否則就會產(chǎn)生死鎖。一個線程在解鎖操作時,若本身并不是獲得鎖資源的線程,它不可以進行解鎖操作。
      [0009]現(xiàn)代操作系統(tǒng)的多道程序設(shè)計機制,使得軟件開發(fā)過程中時常會遇到跨進程的線程互斥的問題,雖然在Linux操作系統(tǒng)下提供了互斥鎖、記錄鎖以及信號量等機制用于互斥,但是,互斥鎖通常用單個進程內(nèi)的線程互斥,擴展到跨進程的線程互斥時,不僅使用起來不便,而且對于垃圾值的情況無法處理;記錄鎖可用于進程間的互斥,但是卻不能用于線程的互斥,它并不是線程安全的;而信號量中分為有名信號量和無名信號量,無名信號量用于單個進程內(nèi)的線程之間,有名信號量則用于跨進程間的線程之間,不過如果簡單的使用有名信號量,會遇到垃圾值、死鎖等問題。
      [0010]考慮到上述情況,需要設(shè)計并實現(xiàn)一種可以在跨進程的線程間進行互斥的方法,且這種方法在使用時具有易用性和靈活性。

      【發(fā)明內(nèi)容】

      [0011]鑒于上述的分析,本發(fā)明旨在提供一種跨進程的線程間進行互斥的方法,用以解決現(xiàn)有技術(shù)中Linux下對共享資源的無法進行互斥訪問的問題的問題。
      [0012]本發(fā)明的目的主要是通過以下技術(shù)方案實現(xiàn)的:
      [0013]一種跨進程的線程間進行互斥的方法,包括以下步驟:
      [0014]步驟一、多個線程競爭互斥信息,勝出的線程初始化互斥信息;
      [0015]步驟二、當(dāng)勝出的線程獲得互斥信息之后,利用互斥信息對臨界區(qū)進行加鎖操作;
      [0016]步驟三、進行加鎖操作后,線程獲得互斥信息的鎖,訪問共享資源;同時,其它線程進tx等待;
      [0017]步驟四、線程使用完共享資源之后,離開臨界區(qū),進行解鎖操作;互斥信息繼續(xù)被其它線程競爭,重復(fù)上述步驟。
      [0018]其中,所述步驟一進一步包括:
      [0019]通過名稱來判斷該互斥信息在系統(tǒng)中是否存在;
      [0020]如果否,則創(chuàng)建并初始化該互斥信息;
      [0021]如果是,則判定該已存在的互斥信息中的值是否是垃圾值;
      [0022]如果是垃圾值,則清除垃圾值并重新初始化;
      [0023]如果不是垃圾值,直接獲取該互斥信息。
      [0024]其中,所述通過名稱來判斷該互斥信息在系統(tǒng)中是否存在進一步包括:
      [0025]獲取互斥信息名稱,
      [0026]將互斥信息名稱進行hash映射轉(zhuǎn)換為id;
      [0027]檢查該id所代表的互斥信息是否存在。
      [0028]其中,所述步驟二進一步包括:
      [0029]首先,判斷當(dāng)前請求加鎖線程是否已經(jīng)獲得鎖;
      [0030]如果是,則返回正確;
      [0031]如果否,則判斷嘗試枷鎖的等待時間是否為無限等待;
      [0032]如果是,則進行無限等待直至加鎖成功;
      [0033]如果否,則進行有限等待,在設(shè)定的有限時間內(nèi)進行加鎖等待;
      [0034]如果加鎖成功,則更新上鎖的線程號及鎖狀態(tài)標記。
      [0035]其中,所述步驟四進一步包括:
      [0036]首先判斷當(dāng)前互斥信息的狀態(tài)是否是上鎖狀態(tài);
      [0037]如果否,即沒有線程獲得了互斥信息的鎖,則直接返回正確;
      [0038]如果是,則繼續(xù)判斷當(dāng)前執(zhí)行解鎖的線程是否獲得鎖的線程,因為只有獲得鎖的線程才能進行解鎖操作,其它線程不允許執(zhí)行解鎖操作;
      [0039]如果是,則對互斥信息進行解鎖操作,復(fù)位上鎖線程號和鎖狀態(tài);
      [0040]這樣其它線程又可以繼續(xù)競爭;如果不是,則無法進行解鎖操作,返回錯誤。
      [0041 ]其中,所述步驟四進一步包括:
      [0042]當(dāng)所有線程都不再繼續(xù)使用互斥信息時,對互斥信息進行刪除操作。
      [0043]本發(fā)明有益效果如下:
      [0044](I)所述方法結(jié)合了信號量機制,確保了加鎖、解鎖的原子性,使得該方法是線程安全的;
      [0045](2)所述方法有效的解決了互斥信息垃圾值問題,避免了線程在使用時獲取了垃圾值而導(dǎo)致異常的問題;
      [0046](3)所述方法通過保存獲得鎖的線程號等信息,解決了加鎖時自身向自身索要鎖而導(dǎo)致死鎖的問題,同時也保證了解鎖時只有獲得鎖的線程才有資格解鎖,避免了越權(quán)限解鎖的問題。
      [0047]本發(fā)明的其他特征和優(yōu)點將在隨后的說明書中闡述,并且,部分的從說明書中變得顯而易見,或者通過實施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點可通過在所寫的說明書、權(quán)利要求書、以及附圖中所特別指出的結(jié)構(gòu)來實現(xiàn)和獲得。
      【附圖說明】
      [0048]附圖僅用于示出具體實施例的目的,而并不認為是對本發(fā)明的限制,在整個附圖中,相同的參考符號表不相同的部件。
      [0049]圖1為本發(fā)明具體實施例中互斥信息存取的示意圖;
      [0050]圖2為本發(fā)明具體實施例中初始化互斥信息的流程圖;
      [0051]圖3為本發(fā)
      當(dāng)前第1頁1 2 
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1