VC MFC 多執行緒及執行緒同步

2021-05-21 21:19:54 字數 1513 閱讀 8197

自動事件:

cevent類的建構函式,第二個引數為false,是自動事件,自動事件在呼叫setevent函式被使用後能夠自動恢復為無訊號狀態。預設情況下,是自動事件。

1、宣告事件為全域性物件。

//包含使用執行緒同步物件所需要的標頭檔案

#include "afxmt.h"

cevent eventobj; //構造乙個自動事件物件

2、在乙個執行緒中使用csyncobject::lock函式來等待訊號,如果事件無訊號,該執行緒被掛起等待。

//鎖住事件

eventobj.lock(); //等待事件有訊號才返回

3、在另外乙個執行緒中使用cevent::setevent來設定適當的事件為有訊號狀態,此時即可讓等待的執行緒繼續執行。

eventobj.setevent(); //設定事件變成有訊號狀態

注意:一般來說,在實際應用中不要輕易阻塞主線程,因為主線程一般是負責和使用者進行互動的,阻塞主線程會影響應用程式的互動性。

手動事件:

cevent類的建構函式,第二個引數為true,是手動事件,手動事件在呼叫setevent函式處於活動狀態時,一直出於這個狀態,直到程式顯式地呼叫resetevent為止。

為了簡便起見,後面所有執行緒函式都通過彈出訊息框的形式來告知使用者執行緒的同步情況。同時約定,在檢視區單擊滑鼠左鍵就會建立乙個工作執行緒。單擊滑鼠右鍵則使事件物件處於有訊號狀態。

自動事件就好比地鐵的自動檢票口,一張票(setevent)只能使乙個人(執行緒)通過;而手動事件則可以理解為路口的紅綠燈,紅燈表示無訊號,所有的人(執行緒)都必須等待,當變為綠燈時(事件有訊號),所有等待的人都可以通過,直到下次變為紅燈(呼叫resetevent函式)為止。

臨界段:

臨界段(critical sections)是一種保證在某一時刻只有乙個執行緒能夠訪問共享資料的簡便方法,只能被使用在乙個程序內的執行緒間進行通訊。

1、宣告臨界段為全域性物件。

//包含使用執行緒同步物件所需要的標頭檔案

#include "afxmt.h"

ccriticalsection criticalsection; //構造乙個自動事件物件

2、執行緒想訪問共享資源,會呼叫臨界段的成員函式,該函式會將資源關鍵字交給呼叫執行緒(假設其他執行緒沒有擁有該臨界段):

criticalsection.lock(); //試圖鎖定臨界段

如果其他執行緒已經鎖定了該臨界段,那麼呼叫執行緒都會處於阻塞狀態,直到該臨界段被釋放為止。否則,呼叫執行緒就會成為該臨界段的擁有者,並且能夠訪問共享資源。

3、呼叫執行緒完成對資源的處理後,通過呼叫下面的函式來釋放臨界段物件:

criticalsection.unlock(); //解除臨界段

釋放的臨界段物件就可以被其他執行緒物件得到,並訪問受保護的資料。

多個執行緒使用臨界段訪問共享資源就好比人們在火車上去洗手間。每個人代表乙個執行緒,因此,洗手間的門鎖就是臨界段物件了。每個執行緒(人)使用共享資源時(洗手間),必須先使用臨界段物件(門鎖)鎖住共享資源。如果共享資源已經被其他執行緒鎖住了,則必須等待,直到臨界段物件(門鎖)被釋放為止。

VC MFC怎麼實現「多執行緒」

我們都會發現,如過給主視窗過多的任務,或者讓主視窗過多地sleep,那麼主視窗很難響應使用者的任何操作,甚至在此種情況下想要移動一下主視窗都會造成視窗標題欄顯示 沒有響應 如此一來,大多使用者都會啟動任 務管理器來結束這個假死的視窗。如何避免這種情況呢?一種辦法就是使用多執行緒,也就是把那些耗時耗力...

Linux多執行緒及執行緒同步簡單例項

一 多執行緒基本概念 1.執行緒的基本概念 執行緒就是輕量級的程序 執行緒和建立他的程序共享 段 資料段 執行緒擁有自己的棧 2.在實際應用中,多個執行緒往往會訪問同一資料或資源,為避免執行緒之間相互影響,需要引入互斥機制,而互斥鎖 mutex 是互斥機制中的一種 3.簡單例項 include in...

多執行緒同步

synchronized 物件 其中物件相當於乙個標誌 鎖 用於判斷 同步 塊 同步的前提必須是兩個或兩個以上的執行緒,且共用同乙個鎖 同步解決了多執行緒的安全問題 弊端 多執行緒需要判斷鎖,消耗了資源 同步函式 將synchronized放在函式名前面即可 即具有同步性質 使用的鎖是this 靜態...