多線程一直是眾多開發者「懂概念、不懂實戰」的盲區。早期我僅會複製舊代碼稍作修改,缺乏系統理解。本文結合 MFC 對話框實例,從線程基礎概念切入,對比 CreateThread 與 AfxBeginThread 兩種創建方式,並演示基本同步控制,幫助建立扎實的多線程開發認知。
線程是進程內獨立調度的基本單位,擁有線程 ID、指令指針、寄存器組與堆棧。線程不擁有系統資源,但共享所屬進程的全部資源。狀態分為就緒、阻塞、運行三態。每個程式至少有一個主線程。
建立標準 MFC 對話框專案,放置 Edit 控件(IDC_EDIT_NUMBER)與 Button(IDC_BUTTON_START),為 Edit 關聯變量 CEdit* m_editNumber。編寫線程函數:
DWORD _stdcall ThreadProc(LPVOID lpParameter) {
CMultithreadTestDlg* dlg = (CMultithreadTestDlg*)lpParameter;
CString szCounter;
for (int i = 0; i < 10000; i++) {
szCounter.Format(_T("%d"), i);
dlg->m_editNumber.SetWindowTextW(szCounter);
szCounter.ReleaseBuffer();
}
return 0;
}
按鈕點擊事件中創建線程:
void CMultithreadTestDlg::OnBnClickedButtonStart() {
m_hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL);
}
CreateThread 參數詳解:
lpThreadAttributes:安全屬性,通常 NULLdwStackSize:堆棧大小,0 表示系統動態調整lpStartAddress:線程函數指針,必須符合 DWORD WINAPI ThreadProc(LPVOID) 簽名lpParameter:傳遞參數,此處傳 this 指針dwCreationFlags:0 立即運行,CREATE_SUSPENDED 掛起創建lpThreadId:接收線程 ID,不需可傳 NULL運行效果:Edit 控件數字高速遞增。

上述代碼存在兩大風險:
CreateThread 易導致運行時庫狀態不一致,官方建議使用 AfxBeginThread。AfxBeginThread 兩種重載形式,常用第一種:
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
修改線程函數返回類型為 UINT,創建代碼簡化為:
CWinThread* m_thread; // 成員變量
m_thread = AfxBeginThread(ThreadProc, this);
線程控制更便捷:m_thread->SuspendThread() 掛起,m_thread->ResumeThread() 恢復。
本文僅覆蓋線程創建與基礎控制。後續將深入探討:線程同步機制、死鎖避免、線程池模式、守護線程、信號量等核心主題。建議參考《Windows 核心程序設計》與 Wikipedia Thread 條目 系統補充。

本文出自「正面旺得福反面泰瑞寶」博客,轉載請保留出處:原文鏈接