互斥量是系統核心物件,誰擁有就誰執行。它與臨界區工作很類似。不同處在於:1、互斥量可以跨程序邊界同步執行緒。2、可以給互斥量取個名字,通過引用互斥量的名字來使用乙個已知的互斥量物件。
使用互斥量之類的物件需要反覆呼叫系統核心,期間需要進行程序上下文轉換和控制級別轉換,大概需要耗費400到600個時間週期。
又是圖書館的比喻,現在是搞乙個鎖,把鑰匙(互斥量控制代碼)交給管理員(作業系統),每乙個人(執行緒)想要借書的時候,都要向管理員拿鑰匙。當有人在使用的時候,另一人必須等待,等到鑰匙有空的時候(互斥量進入訊號狀態),才能拿到鑰匙(擁有了控制代碼)辦理借書業務(此時互斥量進入非訊號狀態直到辦完業務)。
使用互斥量的步驟:
1、宣告乙個全域性的互斥量控制代碼變數(var hmutex: thandle;);
2、建立互斥量:createmutex(
lpmutexattributes: psecurityattributes;
binitialowner: bool;
lpname: pwidechar ): thandle;
(lpmutexattributes引數:指向tsecurityattributes的指標,安全屬性,一般用預設安全屬性nil;
binitialower引數:表示建立的互斥量執行緒是否是互斥量的屬主,如果該引數為false互斥量就沒屬主,一般來講應設為false,否則如果設為true的話,要當主線程結束其他執行緒才成為它的屬主才能執行;
lpname引數:是互斥量的名字,若打算取名的話,則傳入nil。)
3、用等待函式控制線程進入同步**塊:waitforsingleobject(
hhandle:thandel;
dwmilliseconds:dword):dword;
(hhandel引數:是物件的控制代碼,不同物件訊號狀態不同,對於互斥量而言當沒有執行緒占有時,互斥量就時入訊號狀態;
dwmilliseconds引數:可以是乙個時間段,可以是0表示僅檢查物件狀態後立即返回,可以是infinite值表示函式一直等待直到物件進入訊號狀態;
返回值常量如下:wait_abandoned指定的物件是互斥量物件,擁有這個互斥量物件的執行緒在沒有釋放互斥量之前就已經終止,稱作廢棄互斥量,此時該互斥量歸呼叫執行緒所擁有,並把這個互斥量設為非訊號狀態;wait_object_0指定物件的進入訊號狀態;wait_timeout等待時間已過,物件狀態依然是無訊號狀態)
4、執行執行緒執行**。
5、執行緒執行完後釋放互斥量的擁有權:releasemutex(hmutex: thandle);
6、最後關閉互斥量:closehandle(hmutex: thandle);
同樣的例子,使用互斥量:
執行結果與前文相似,這裡借用前文的圖(除了執行緒id不同)
Linux 多執行緒互斥量互斥
同乙個程序中的多個執行緒共享所在程序的記憶體資源,當多個執行緒在同一時刻同時訪問同一種共享資源時,需要相互協調,以避免出現資料的不一致和覆蓋等問題,執行緒之間的協調和通訊的就叫做執行緒的同步問題,執行緒同步的思路 讓多個執行緒依次訪問共享資源,而不是並行 mutex被建立時可以有初始值,表示mute...
多執行緒 共享互斥量
就像之前我們提過的一樣,很多執行緒需要互斥量進行相互鎖定,因為很多關鍵資料和操作並不是執行緒安全,多執行緒處理很有可能會出很大的問題。但是互斥量又會帶來乙個問題,我就舉個例子來說明 比如說,現在有一組資料,可以對它進行讀寫操作。但是一般情況讀寫要分開操作,因為這樣才可以讓後續處理更好的執行。很明顯的...
c 多執行緒 互斥量
我們在做程式時,有時候希望在一台電腦上面只有乙個程序例項在執行,利用mutex互斥量可以實現了這個功能,方法及步驟如下 接下來分控制台程式和winform程式兩種情況下實現此功能 1.控制台程式 csharp view plain copy using system using system.col...