臨界區、互斥區、事件、訊號量四種方式
臨界區(critical section)、互斥量(mutex)、訊號量(semaphore)、事件(event)的區別
1、臨界區:通過對多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行訪問,如果有多個執行緒試圖訪問公共資源,那麼在有乙個執行緒進入後,其他試圖訪問公共資源的執行緒將被掛起,並一直等到進入臨界區的執行緒離開,臨界區在被釋放後,其他執行緒才可以搶占。
2、互斥量:採用互斥物件機制。 只有擁有互斥物件的執行緒才有訪問公共資源的許可權,因為互斥物件只有乙個,所以能保證公共資源不會同時被多個執行緒訪問。互斥不僅能實現同一應用程式的公共資源安全共享,還能實現不同應用程式的公共資源安全共享
3、訊號量:它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目
4、事 件: 通過通知操作的方式來保持執行緒的同步,還可以方便實現對多個執行緒的優先順序比較的操作
在這裡我們要講的互斥鎖,像乙個物件,這個物件只能同時被乙個執行緒持有。如此一來,便可以通過互斥鎖來實現執行緒的同步
一、建立
建立互斥鎖的方法是呼叫函式createmutex:
handle createmutex(createmutex(&sa, binitialowner, szname);第乙個引數是乙個指向security_attributes結構體的指標,一般的情況下,可以是nullptr。lpsecurity_attributeslpmutexattributes,
//指向安全屬性的指標
boolbinitialowner, //
初始化互斥物件的所有者
lpctstrlpname //
指向互斥物件名的指標
);
第二個引數型別為bool,表示互斥鎖建立出來後是否被當前執行緒持有。
第三個引數型別為字串(const tchar*),是這個互斥鎖的名字,如果是nullptr,則互斥鎖是匿名的。
例:handle hmutex = createmutex(nullptr, false, nullptr);上面的**建立了乙個匿名的互斥鎖,建立出來後,當前執行緒不持有這個互斥鎖。
二、持有
waitforsingleobject函式可以讓乙個執行緒持有互斥鎖。
dword waitforsingleobject(handle hhandle,
dword dwmilliseconds
);
用法:waitforsingleobject(hmutex, dwtimeout);這個函式的作用比較多。這裡只介紹第乙個引數為互斥鎖控制代碼時的作用。
它的作用是等待,直到一定時間之後,或者,其他執行緒均不持有hmutex。第二個引數是等待的時間(單位:毫秒),如果該引數為infinite,則該函式會一直等待下去。
三、釋放
用releasemutex函式可以讓當前執行緒「放開」乙個互斥鎖(不持有它了),以便讓其他執行緒可以持有它。
bool winapi releasemutex(handle hmutex
);
用法releasemutex(hmutex);
四、銷毀
當程式不再需要互斥鎖時,要銷毀它。
bool closehandle(closehandle(hmutex);handle hobject
);
五、命名互斥鎖
如果createmutex函式的第三個引數傳入乙個字串,那麼所建立的鎖就是命名的。當乙個命名的鎖被建立出來以後,當前程序和其他程序如果試圖建立相同名字的鎖,createmutex會返回原來那把鎖的控制代碼,並且getlasterror函式會返回error_already_exists。這個特點可以使乙個程式在同一時刻最多執行乙個例項。
1.boolcdemodlg::oninitdialog()
2.
9.
// 其他**
10.
11.returntrue;
12. }
Windows下C 多執行緒同步
程式 是計算機指令的集合,它以檔案的形式儲存在磁碟上。而程序通常被定義為乙個正在執行程式的例項,是乙個程式在其自身位址空間的依次執行活動。程序 執行緒 由執行緒的核心物件和執行緒棧組成 當多執行緒訪問全域性變數時需要多執行緒同步 互斥物件 事件物件 關鍵 段 互斥物件 互斥獨享可以看做是一把房間鑰匙...
Windows執行緒同步
以下內容摘抄自 visual c 開發技術大全 為學習筆記。執行緒同步的方法有很多,最常用的有 互斥 cmutex 臨界 criticalsection 訊號量 semaphore 事件 event 等。這4種方式分別在 win32 和 mfc 兩種方式下各有一種實現,mfc 方式是對 win32方...
Windows執行緒同步
多執行緒程式中,多個執行緒在申請唯一份資源時,存在乙個隱患那就是重複使用。舉乙個例子,火車售票系統,一共100張票,用兩個執行緒來模擬售票。dword winapi fun1proc lpvoid lpparameter dword winapi fun1proc lpvoid lpparamete...