Windows執行緒同步之互斥鎖(Mutex)

2021-07-16 17:40:27 字數 1657 閱讀 2603

執行緒同步的方式和機制

臨界區、互斥區、事件、訊號量四種方式

臨界區(critical section

)、互斥量(

mutex

)、訊號量(

semaphore

)、事件(

event

)的區別

1、臨界區:通過對多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行訪問,如果有多個執行緒試圖訪問公共資源,那麼在有乙個執行緒進入後,其他試圖訪問公共資源的執行緒將被掛起,並一直等到進入臨界區的執行緒離開,臨界區在被釋放後,其他執行緒才可以搶占。

2、互斥量:採用互斥物件機制。 只有擁有互斥物件的執行緒才有訪問公共資源的許可權,因為互斥物件只有乙個,所以能保證公共資源不會同時被多個執行緒訪問。互斥不僅能實現同一應用程式的公共資源安全共享,還能實現不同應用程式的公共資源安全共享

3、訊號量:它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目

4、事 件: 通過通知操作的方式來保持執行緒的同步,還可以方便實現對多個執行緒的優先順序比較的操作

在這裡我們要講的互斥鎖,像乙個物件,這個物件只能同時被乙個執行緒持有。如此一來,便可以通過互斥鎖來實現執行緒的同步

一、建立

建立互斥鎖的方法是呼叫函式createmutex:

createmutex(&sa, binitialowner, szname);第乙個引數是乙個指向security_attributes結構體的指標,一般的情況下,可以是nullptr。

第二個引數型別為bool,表示互斥鎖建立出來後是否被當前執行緒持有。

第三個引數型別為字串(const tchar*),是這個互斥鎖的名字,如果是nullptr,則互斥鎖是匿名的。

例:handle hmutex = createmutex(nullptr, false, nullptr);上面的**建立了乙個匿名的互斥鎖,建立出來後,當前執行緒不持有這個互斥鎖。

二、持有

waitforsingleobject函式可以讓乙個執行緒持有互斥鎖。用法:

waitforsingleobject(hmutex, dwtimeout);這個函式的作用比較多。這裡只介紹第乙個引數為互斥鎖控制代碼時的作用。

它的作用是等待,直到一定時間之後,或者,其他執行緒均不持有hmutex。第二個引數是等待的時間(單位:毫秒),如果該引數為infinite,則該函式會一直等待下去。

三、釋放

用releasemutex函式可以讓當前執行緒「放開」乙個互斥鎖(不持有它了),以便讓其他執行緒可以持有它。用法

releasemutex(hmutex);

四、銷毀

當程式不再需要互斥鎖時,要銷毀它。

closehandle(hmutex);

五、命名互斥鎖

如果createmutex函式的第三個引數傳入乙個字串,那麼所建立的鎖就是命名的。當乙個命名的鎖被建立出來以後,當前程序和其他程序如果試圖建立相同名字的鎖,createmutex會返回原來那把鎖的控制代碼,並且getlasterror函式會返回error_already_exists。這個特點可以使乙個程式在同一時刻最多執行乙個例項。

bool cdemodlg::oninitdialog()

// 其他**

return true;

}

Windows執行緒同步之互斥鎖(Mutex)

執行緒同步的方式和機制 臨界區 互斥區 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行...

執行緒同步之互斥鎖

為什麼要執行緒同步?當多執行緒共享相同的記憶體的時候,需要每乙個執行緒看到相同的檢視。當乙個執行緒被修改時,其他的執行緒也可以修改或者讀取這個變數,所以就需要對這些執行緒同步,保證不會訪問到無效的變數。舉個例子 由此可見,執行緒同步的重要性。執行緒同步之互斥鎖的函式 1.include 2.int ...

多執行緒同步之互斥鎖

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