執行緒同步的方式和機制
臨界區、互斥區、事件、訊號量四種方式
臨界區(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。這個特點可以使乙個程式在同一時刻最多執行乙個例項。
[cpp]
view plain
copy
bool
cdemodlg::oninitdialog()
// 其他**
return
true;
}
Windows執行緒同步之互斥鎖(Mutex)
執行緒同步的方式和機制 臨界區 互斥區 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行...
執行緒同步之互斥鎖
為什麼要執行緒同步?當多執行緒共享相同的記憶體的時候,需要每乙個執行緒看到相同的檢視。當乙個執行緒被修改時,其他的執行緒也可以修改或者讀取這個變數,所以就需要對這些執行緒同步,保證不會訪問到無效的變數。舉個例子 由此可見,執行緒同步的重要性。執行緒同步之互斥鎖的函式 1.include 2.int ...
多執行緒同步之互斥鎖
對於多執行緒程式來說,同步是指在一定的時間內只允許某乙個執行緒訪問某個資源 而在 此時間內,不允許其他的執行緒訪問該資源。同步資源的方式 互斥鎖 條件變數 讀寫鎖 訊號量。下面介紹下互斥鎖 將互斥鎖想象成乙個只能容納乙個人的洗手間,當某個人進入洗手間的時候,可以從 裡面將洗手間鎖上,其他人只能在互斥...