首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

多線程程設計入門實戰:從 CreateThread 到 AfxBeginThread

     編輯:關於C語言

多線程一直是眾多開發者「懂概念、不懂實戰」的盲區。早期我僅會複製舊代碼稍作修改,缺乏系統理解。本文結合 MFC 對話框實例,從線程基礎概念切入,對比 CreateThread 與 AfxBeginThread 兩種創建方式,並演示基本同步控制,幫助建立扎實的多線程開發認知。

線程基礎概念速覽

線程是進程內獨立調度的基本單位,擁有線程 ID、指令指針、寄存器組與堆棧。線程不擁有系統資源,但共享所屬進程的全部資源。狀態分為就緒、阻塞、運行三態。每個程式至少有一個主線程。

MFC 對話框實例:啟動計數器線程

建立標準 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:安全屬性,通常 NULL
  • dwStackSize:堆棧大小,0 表示系統動態調整
  • lpStartAddress:線程函數指針,必須符合 DWORD WINAPI ThreadProc(LPVOID) 簽名
  • lpParameter:傳遞參數,此處傳 this 指針
  • dwCreationFlags:0 立即運行,CREATE_SUSPENDED 掛起創建
  • lpThreadId:接收線程 ID,不需可傳 NULL

運行效果:Edit 控件數字高速遞增。

計數器運行效果

隱患與改進:為何推薦 AfxBeginThread

上述代碼存在兩大風險:

  1. MFC 環境下直接用 CreateThread 易導致運行時庫狀態不一致,官方建議使用 AfxBeginThread。
  2. 連續點擊按鈕會創建大量線程耗盡記憶體,需加標志位防重入。

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 條目 系統補充。

線程概念圖解

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved