核心概念對照
| 維度 | 行程 | 執行緒 |
| 定義 | 程式的一次執行實例 | 行程內的執行路徑/排程單位 |
| 記憶體空間 | 獨立虛擬位址空間 | 共享行程空間(堆疊、全域、堆積) |
| 資源隔離 | 完全隔離,需 IPC 通訊 | 天然共享,同步較簡單 |
| 建立/切換開銷 | 大(載入映像、建立頁表) | 小(僅分配堆疊、上下文) |
| 錯誤影響範圍 | 單一行程崩潰不波及其他 | 單一執行緒崩潰導致整行程終止 |
| 優先權 | 行程優先權類別 | 執行緒優先權等級(相對行程基準) |
為何需要多執行緒?
- 回應性: GUI 執行緒專職處理訊息泵,耗時運算(檔案 I/O、計算、網路)移至工作執行緒,介面不凍結。
- 並行處理: 多核心 CPU 真正並行執行多條執行緒,縮短總完成時間。
- 資源共享效率: 同一行程內執行緒共享記憶體,避免序列化/反序列化與 IPC 開銷。
- 模組化設計: 邏輯上獨立任務(如監聽連線、資料庫寫入、定時清理)對應獨立執行緒,降低耦合。
經典範例:生產者-消費者模式
主執行緒接收使用者輸入(生產者),工作執行緒處理資料並更新 UI(消費者),透過佇列 + 事件/臨界區同步。避免單執行緒輪詢或阻塞。
多執行緒帶來的挑戰
- 資料競爭: 多執行緒存取共享資料需同步(Critical Section、Mutex、Semaphore)。
- 死鎖: 鎖獲取順序不一致、巢狀鎖、等待條件未通知。
- 記憶體可見性: 編譯器/CPU 最佳化導致讀取舊值,需
volatile、Memory Barrier 或原子操作。
- 除錯困難: 時序相關 Bug 難重現,需大量日誌、執行緒命名、工具支援 (Visual Studio 執行緒視窗、Intel VTune)。
MFC 執行緒類別選擇
CWinThread:MFC 執行緒基類,CWinApp 即派生於此。支援訊息泵(UI 執行緒)或無訊息泵(工作域緒)。
AfxBeginThread:建立執行緒的統一介面,自動處理 MFC 模組狀態切換、例外傳播、m_bAutoDelete 清理。
- 建議: 純計算/IO 工作執行緒用
AfxBeginThread + 全域函式或 CWinThread 衍生類;需建立視窗/處理訊息用 UI 執行緒衍生 CWinThread 並覆寫 InitInstance。
- 上一篇文章: WinInet 程式設計:CInternetSession 實作 HTTP/FTP 客戶端完整指南
- 下一篇文章: Win32 行程控制實戰:CreateProcess 參數詳解與常見應用模式
Copyright ©
程式碼之家 All Rights Reserved