《windows核心編程學習筆記》——使用互斥量變數核心對象進行線程同步

來源:互聯網
上載者:User

用途:互斥量核心對象用來確保一個線程獨佔對一個資源的訪問。
用法:
          如多個線程需要對同一記憶體進行讀寫操作。大致操作如下:
HANDLE hMutex = CreateMutex(NULL, FALSE, NULL); //建立一個互斥量
T Read()
{

WaitForSingleObject(hMutex, INFINITE);

//read the buffer

ReleaseMutex(hMutex);

}
void Write(T data)
{

WaitForSingleObject(hMutex, INFINITE);

//write the buffer

ReleaseMutex();

}

理解:
          建立一個互斥量用於線程同步,互斥量對象包含一個使用計數,線程ID及一個遞迴計數。線程ID用來標識當前佔用這個互斥量的是系統的哪個線程,遞迴計數標識這個線程佔用改互斥量的次數。CreateMutex的第二個參數指定了互斥量核心對象初始建立時的狀態(TRUE 未觸發,FALSE已觸發),其他參數參見MSDN。假設當前有兩個線程,一個進行操作,一個進行讀操作。
          假設寫線程第一次執行Write操作,調用等待函數WaitForSingleObject,  傳入互斥量控制代碼。在內部,等待函數會檢查互斥量線程ID是否為0(互斥量處於觸發狀態)。如果為0,那麼函數會把線程ID設為條用線程的線程ID,把遞迴計數設為1,然後讓調用線程繼續運行。需要說明的是WaitForSingleObject 函數使一個線程自願進入等待狀態,直到指定的核心對象被觸發為止。但是,如果線程在調用一個等待函數的時候,相應的核心對象已經處於觸發狀態,那麼線程是不會進入等待狀態的。也就是說等待函數等待的是核心對象狀態瞬間的變化(由未觸發變為已觸發),而不是等待變化完的狀態。如果上面的例子中建立互斥量的時候,第二個參數傳入的是TRUE,也就是初始狀態是未觸發的,那麼除非我們明確的調用函數使核心狀態變為觸發狀態,否則讀寫線程永遠也不會捕捉到核心狀態的變化,這樣就會出現永遠等待的情況。
          回到剛才的情況,寫線程正在執行寫操作,互斥量核心對象的線程ID記錄這當前佔有這個互斥量的線程ID。此時,讀線程執行Read操作,調用等待函數,等待函數檢查互斥量線程ID,發現ID不為0,讀線程進入等待狀態。 當寫線程完成寫操作之後,調用ReleaseMutex。 在內部,這個函數會將互斥量核心對象的遞迴計數減1,當遞迴計數變成0的時候,函數還會將線程ID設為0,這樣就觸發了核心對象。當對象被觸發的時候,系統會檢查有沒有其他的線程正在等待該互斥量,如果有系統會“公平地”選擇一個正在等待的線程,把互斥量的所有權給它,同樣,核心對象把線程ID設為佔有互斥量的那個線程ID,遞迴計數設為1。上例中,此時的讀線程就有機會讀記憶體了。如果沒有線程等待,那麼互斥量會保持在觸發狀態,這樣下一個等待它的線程就可以立即進入互斥地區了。

注意:
         (1)假設線程試圖等待一個未觸發的核心對象,線程通常會進入等待狀態。但對於互斥量核心對象卻不一定如此,如果此時線程ID和互斥量內部線程ID一致,那麼線程會保持可調度狀態,即使互斥量處於未觸發狀態。簡單點說就是在當前線程擁有互斥區的時候又調用WaitForSingleObject。這也是是遞迴計數大於1的唯一途徑。如果多次成功等待了互斥量,也必須調用相應次數的ReleaseMutex函數使互斥量處於觸發狀態。
         (2)線程是否互斥量的時候,線程ID如果與互斥量內部ID一致,遞迴計數減1。如果不一致,則ReleaseMutex會返回FALSE給調用者,指示調用失敗。如果釋放互斥量的線程已經終止,系統會認為互斥量已被“遺棄”。這是系統會自動將互斥量線程ID設為0,遞迴計數設為0,互斥量處於已觸發狀態。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.