1. 程式人生 > >《深入淺出MFC》第十四章 多線程程序設計

《深入淺出MFC》第十四章 多線程程序設計

同步 相關 註意 RKE 變量 大堆 操作系統 使用 判斷

模塊表示一段可執行的程序,其程序、數據、資源都被加載到內存中,由系統構建一個數據結構來管理它,就是一個模塊,這個數據結構被稱作MDB。進程是一大堆擁有權的集合,進程擁有地址控件,動態配置的內存、文件、線程、和一系列模塊,操作系統用PDB的數據結構來管理它。線程表示程序代碼的執行事實,系統用TDB數據結構來記錄和管理線程相關的內存地址控件,數據、消息隊列等。

程序的執行發生在線程上而非進程上,因此CPU的調度單位是線程而非進程。線程的調度完全根據優先級來判斷,但是調度器會動態調整線程的優先級一次來提高系統的響應性。

線程的執行上下文用來管理線程執行時的動態信息,以便線程被再次分配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成員函數。當為不同的線程指定相同的線程函數時,這時要特別註意線程函數中使用的全局變量和靜態變量,因為多個線程會共享這些數據,至於放到堆棧中的變量或對象則不會由問題,因為每個線程都有自己的堆棧。

通過派生自己的CWinThread可以創建UI Thread,通過函數AfxBeginThread(RUNTIME_CLASS)。當線程函數return時線程便結束了,或在線程函數中調用AfxEndThread結束一個線程。

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

《深入淺出MFC》第十四章 多線程程序設計