mfc專門封裝了四個類用於實現執行緒同步。他們都繼承自csyncobject。
類名使用方法
適用臨界區
ccriticalsection
如果有多個執行緒試圖同時訪問臨界區,那麼 在有乙個執行緒進入後其他所有試圖訪問此臨界區的執行緒將被掛起,並一直持續到進入臨界區的執行緒離開。臨界區在被釋放後,其他執行緒可以繼續搶占,並以此達到用原子方式操 作共享資源的目的。
互斥量cmutex
使用類成員函式lock()和unlock()標定出被保護**片段即可
互斥量比臨界區複雜。因為使用互斥不僅僅能夠在同一應用程式不同執行緒中實現資源的安全共享,而且可以在不同應用程式的執行緒之間實現對資源的安全共享
訊號量csemaphore
訊號量物件的成員函式lock()將計數器的值 -1,當計數器為0時,就不再允許其他執行緒訪問該資源;而當乙個執行緒使用訊號量物件的成員函式unlock()釋放資源時,可以將計數器的值 +1。
訊號量物件允許多個執行緒訪問同乙個資源,但同時訪問該資源的執行緒總數不能超過訊號量物件的最大計數值
訊號允許多個執行緒同時使用共享資源
事件cevent
setevent()和resetevent().waitforsingleobject().
f分為自動事件和人工事件。自動事件不需要呼叫resetevent()即在waitforsingleobject返回時自動將事件設為無訊號狀態。
總結:
1. 互斥量與臨界區的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越程序使用。所以建立互斥量需要的資源更多,所以如果只為了在程序內部是用的話使用臨界區會帶來速度上的優勢並能夠減少資源佔用量 。因為互斥量是跨程序的互斥量一旦被建立,就可以通過名字開啟它。
2. 互斥量(mutex),訊號量(semaphore),事件(event)都可以被跨越程序使用來進行同步資料操作,而其他的物件與資料同步操作無關,但對於程序和執行緒來講,如果程序和執行緒在執行狀態則為無訊號狀態,在退出後為有訊號狀態。所以可以使用waitforsingleobject來等待程序和執行緒退出。
3. 如果乙個應用同時可以有多個執行緒訪問相應資源,則用csemaphore;
4. 互斥量和事件屬於核心物件,利用核心物件進行執行緒同步,速度較慢,但利用互斥和事件這樣的核心物件,可以在多個程序中的各個執行緒間進行同步。臨界區是工作在使用者方式下,同步速度較快,但在使用關鍵**段時,很容易進入死鎖狀態,因為在等待進入關鍵**段時無法設定超時值。
臨界區 ccriticalsection,在使用者模式工作,適用於保護執行緒間共享資源,乙個執行緒可以多次lock不會出錯。不支援在多程序之間工作。
互斥量 cmutex,在核心模式工作,除了支援臨界區的功能,還可以為互斥量命名,以便在多程序中工作。互斥量比臨界區耗資源。
事件 cevent,在核心模式工作,適用於乙個執行緒等待另乙個執行緒完成某任務。
訊號量 csemaphore,在核心模式工作,適用於允許特定個數的執行緒執行某任務。
參考:
VC 中線程同步技術分析4
管理事件核心物件 在前面講述執行緒通訊時曾使用過事件核心物件來進行執行緒間的通訊,除此之外,事件核心物件也可以通過通知操作的方式來保持執行緒的同步。對於前面那段使用臨界區保持執行緒同步的 可用事件物件的執行緒同步方法改寫如下 事件控制代碼 handle hevent null 共享資源 char g...
VC 中線程同步技術分析3
管理事件核心物件 在前面講述執行緒通訊時曾使用過事件核心物件來進行執行緒間的通訊,除此之外,事件核心物件也可以通過通知操作的方式來保持執行緒的同步。對於前面那段使用臨界區保持執行緒同步的 可用事件物件的執行緒同步方法改寫如下 事件控制代碼 handle hevent null 共享資源 char g...
VC 中線程同步技術分析5
管理事件核心物件 在前面講述執行緒通訊時曾使用過事件核心物件來進行執行緒間的通訊,除此之外,事件核心物件也可以通過通知操作的方式來保持執行緒的同步。對於前面那段使用臨界區保持執行緒同步的 可用事件物件的執行緒同步方法改寫如下 事件控制代碼 handle hevent null 共享資源 char g...