windows下的執行緒同步的方式

2021-07-31 23:57:11 字數 2086 閱讀 2596

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

臨界區(critical section)、互斥量(mutex)、訊號量(semaphore)、事件(event)的區別

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

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

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

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

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

一、建立

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

handle createmutex(

lpsecurity_attributeslpmutexattributes,

//指向安全屬性的指標

boolbinitialowner, //

初始化互斥物件的所有者

lpctstrlpname //

指向互斥物件名的指標

);

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

第二個引數型別為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(

handle hobject

);

closehandle(hmutex);

五、命名互斥鎖

如果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...