《深入淺出MFC》第十四章 多執行緒程式設計

2022-02-10 04:38:43 字數 817 閱讀 8068

模組表示一段可執行的程式,其程式、資料、資源都被載入到記憶體中,由系統構建乙個資料結構來管理它,就是乙個模組,這個資料結構被稱作mdb。程序是一大堆擁有權的集合,程序擁有位址控制項,動態配置的記憶體、檔案、執行緒、和一系列模組,作業系統用pdb的資料結構來管理它。執行緒表示程式**的執行事實,系統用tdb資料結構來記錄和管理執行緒相關的記憶體位址控制項,資料、訊息佇列等。

執行緒的執行上下文用來管理執行緒執行時的動態資訊,以便執行緒被再次分配cpu時能從上次停止的位置執行。

在mfc的層面,執行緒被分為worker thread和ui thread,通過createthread產生的執行緒,並指定乙個執行緒函式,這個執行緒就為worker thread。當執行緒中帶有訊息迴圈並處理某些訊息,執行緒就稱為ui thread。所有與ui相關的操作都應該在ui執行緒中執行,與ui無關的純運算或通訊的工作最好放到worker thread中。

在mfc中通過afxbeginthread產生執行緒,不直接使用createthread是因為前者會執行一些與框架相關的**。使用afxbeginthread產生的執行緒為worker thread。若要產生乙個ui thread,必須要首先定義乙個cwinthread的派生類。

建立執行緒時需要指定執行緒函式,執行緒函式只能是全域性函式或c++類的static成員函式。當為不同的執行緒指定相同的執行緒函式時,這時要特別注意執行緒函式中使用的全域性變數和靜態變數,因為多個執行緒會共享這些資料,至於放到堆疊中的變數或物件則不會由問題,因為每個執行緒都有自己的堆疊。

當進行多執行緒程式開發時,如果多個執行緒之間可以相互聯絡相互通訊,將會使程式變的非常複雜,這時需要使用執行緒同步機制才能處理。windows作業系統提供了四種同步機制,關鍵區域、號誌、事件和互斥器。

深入淺出Win32多執行緒設計之MFC的多執行緒(2)

2.執行緒間通訊 mfc中定義了繼承自csyncobject類的ccriticalsection ccevent cmutex csemaphore類封裝和簡化了win32 api所提供的臨界區 事件 互斥和訊號量。使用這些同步機制,必須包含 afxmt.h 標頭檔案。下圖給出了類的繼承關係 作為c...

深入淺出多執行緒系列之三 執行緒池

執行緒池 每乙個執行緒缺省會被分配 1mb的記憶體,在 c 中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單...

深入淺出多執行緒系列之三 執行緒池

執行緒池 每乙個執行緒缺省會被分配 1mb的記憶體,在 c 中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單...