多執行緒同步之互斥物件

2021-07-28 11:55:11 字數 2209 閱讀 6406

一、互斥物件屬於核心物件,它能夠確保執行緒擁有對單個資源的互斥訪問權。互斥物件包含乙個使用數量、乙個執行緒id、乙個計數器:其中id標識了當前哪個執行緒擁有互斥物件,計數器用於表明該執行緒擁有互斥物件的次數。當該執行緒擁有互斥物件的次數為0時,表明該執行緒釋放了互斥物件的所有權,互斥物件處於有訊號狀態,這樣其它執行緒才可以主動去獲得互斥物件的所有權。

二、互斥物件的使用方法:

1、建立乙個互斥器:createmutex;

handle createmutex(

lpsecurity_attributes lpmutexattributes,

bool binitialowner,

lpctstr lpname

);

引數一:可以置為null,表明互斥物件具有預設的安全性。

引數二:最重要的乙個引數,表明互斥物件初始的擁有者。如果為true,則建立互斥物件的執行緒擁有該互斥物件,當此執行緒使用完互斥物件,要釋放互斥物件的擁有權,這時其它執行緒才能夠獲得互斥物件的擁有權。如果為false,表明當前沒有執行緒擁有這個互斥物件,於是作業系統就會將此互斥物件設定為有訊號狀態,那麼第乙個申請擁有互斥物件所有權的執行緒擁有此互斥物件的多有權,使用完後,同樣要在該執行緒中進行釋放。

引數三:互斥物件的名稱。為null則建立乙個匿名的互斥物件。

返回值:成功:返回建立互斥物件的控制代碼。如果呼叫createmutex()函式之前,互斥物件已經存在,則返回已經存在的這個互斥物件的控制代碼。

說明:1)、互斥物件是唯一與執行緒相關的核心物件。當乙個執行緒擁有該互斥物件時,作業系統會將互斥物件的執行緒id設定為此執行緒id,當呼叫releasemutex()釋放互斥物件的所有權時,作業系統會判斷當前呼叫releasemutex()執行緒的id和互斥物件內部所維護的執行緒id是否相等,只有相等才能操作。也就是說,對於互斥物件來說,哪個執行緒擁有它的所有權,就要在哪個執行緒中進行釋放。

2)、如果某個執行緒得到了互斥物件的所有權,完成了**的執行,但是沒有釋放互斥物件的所有權就退出了,作業系統一旦發現該執行緒已經終止,它就會自動將該執行緒所擁有的互斥物件的執行緒id設為0,並將其計數器歸0,這時其它執行緒就可以主動獲取互斥物件的所有權。同時,我們可以檢測當前擁有互斥器所有權的執行緒是否已經退出!waitfor...函式會返回:wait_abandoned。

3)、當某乙個執行緒得到了互斥物件的所有權,此時互斥物件置為無訊號狀態,在當前執行緒釋放所有權之前,其它執行緒不能獲得互斥物件的所有權。但是當前執行緒仍然可以呼叫waitforsingleobject再次獲得互斥物件的所有權,此時互斥物件內部的計數器+1。所以在同乙個執行緒中多次請求乙個互斥物件,那麼就需要相應的多次呼叫releasemutex函式釋放該互斥物件。

2、開啟乙個已經存在的互斥器:openmutex;

3、獲得互斥器的擁有權:waitforsingleobject、waitformultipleobjects 等一類等待的函式……(可能造成阻塞)。執行緒必須主動請求獲得互斥物件的所有權才能獲得該物件的所有權。

dword waitforsingleobject(

handle hhandle,

dword dwmilliseconds

);

引數一:互斥物件的控制代碼。

引數二:等待時間。

返回值:wait_object_0  互斥物件變為有訊號狀態,函式返回。

wait_timeout   指定的等待時間間隔已到,互斥物件仍為無訊號狀態(被其它執行緒使用),函式返回。

wait_abandoned 先前擁有該物件的執行緒在終止前沒有釋放互斥物件。這時互斥物件的所有權將授予當前調         用執行緒。

4、釋放互斥器的擁有權:releasemutex;

5、關閉互斥器:closehandle;

互斥物件的乙個例項:

handle ghmutex = null;

cstringarray g_arrstring;

uint __cdecl threadproc(lpvoid lpparameter)

//g_arrstring.add(str);

} return 0;

}void cthreadtestdlg::onbnclickedbtn()//單擊按鈕,建立互斥物件,開啟多執行緒

}void cthreadtestdlg::onbnclickedprintbtn()//輸出結果

closehandle(ghmutex);

}

多執行緒同步之互斥鎖

對於多執行緒程式來說,同步是指在一定的時間內只允許某乙個執行緒訪問某個資源 而在 此時間內,不允許其他的執行緒訪問該資源。同步資源的方式 互斥鎖 條件變數 讀寫鎖 訊號量。下面介紹下互斥鎖 將互斥鎖想象成乙個只能容納乙個人的洗手間,當某個人進入洗手間的時候,可以從 裡面將洗手間鎖上,其他人只能在互斥...

Qt 多執行緒同步之互斥鎖

qmutex需要配對使用lock 和unlock 來實現 段的保護 qmutexlocker是另外乙個簡化了互斥量處理的類。qmutexlocker建構函式接受乙個互斥量作為引數並將其鎖定,qmutexlocker的析構函式則將此互斥量解鎖,所以在qmutexlocker例項變數的生存期內的 段得到...

多執行緒同步與互斥

1.互斥 include include include include include pthread mutex t mutex pthread mutex initializer int lock var 0 time t end time void pthread1 void arg voi...