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

Windows API 創建線程完整指南:CreateThread 參數詳解與主線程結束行為測試

     編輯:關於C++

CreateThread 函數原型與參數詳解

HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,  // 安全屬性,NULL 為默認,句柄不可繼承
    SIZE_T dwStackSize,                        // 棧大小(字節),0 為默認(1MB)
    LPTHREAD_START_ROUTINE lpStartAddress,     // 線程入口函數指針
    LPVOID lpParameter,                        // 傳給線程函數的參數
    DWORD dwCreationFlags,                     // 創建標志:0=立即運行,CREATE_SUSPENDED=掛起
    LPDWORD lpThreadId                         // 輸出:線程 ID
);

參數深度解析

參數關鍵說明
lpThreadAttributesNULL 表示默認安全描述符,返回句柄不可被子進程繼承
dwStackSize0 = 默認 1MB;內存不足時創建失敗;可後續動態增長
lpStartAddress簽名:DWORD WINAPI Func(LPVOID);返回值作為線程退出碼
lpParameter32 位值,傳遞任意數據(指針、整數等),需注意類型轉換安全
dwCreationFlags0 立即運行;CREATE_SUSPENDED 掛起需 ResumeThread 喚醒
lpThreadId接收線程 ID 的變量地址,非線程句柄

關鍵配套函數

BOOL CloseHandle(HANDLE hObject);  // 關閉句柄,減少內核引用計數,非強制終止線程

測試代碼 1:子線程循環次數 < 主線程

#include <windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI PrintThread(LPVOID data) {
    cout << "線程啟動\n";
    for (int i = 0; i < 25; ++i) {  // 子線程 25 次
        cout << "Thread_" << (int)data << "_" << i << "\n";
        Sleep(100);
    }
    cout << "PrintThread 結束\n";
    return (DWORD)data;
}

int main() {
    HANDLE hThread;
    DWORD threadId;
    hThread = CreateThread(NULL, 0, PrintThread, (LPVOID)1, 0, &threadId);

    for (int i = 0; i < 50; ++i) {  // 主線程 50 次
        cout << "Main_" << i << "\n";
        Sleep(100);
    }
    CloseHandle(hThread);
    system("pause");
    return 0;
}

現象:主線程結束前子線程已結束,程序正常退出(配合 system("pause") 觀察)。

測試代碼 2:子線程循環次數 > 主線程

DWORD WINAPI PrintThread(LPVOID data) {
    cout << "線程啟動\n";
    for (int i = 0; i < 50; ++i) {  // 子線程 50 次
        cout << "Thread_" << (int)data << "_" << i << "\n";
        Sleep(100);
    }
    cout << "PrintThread 結束\n";
    return (DWORD)data;
}

int main() {
    HANDLE hThread;
    DWORD threadId;
    hThread = CreateThread(NULL, 0, PrintThread, (LPVOID)1, 0, &threadId);

    for (int i = 0; i < 25; ++i) {  // 主線程 25 次
        cout << "Main_" << i << "\n";
        Sleep(100);
    }
    CloseHandle(hThread);
    system("pause");
    return 0;
}

關鍵現象:

  • 主線程循環結束後,子線程繼續運行直到完成
  • 若移除 system("pause"),主線程結束導致進程直接退出,子線程被強制終止,無法看到後續輸出

核心結論

  1. 主線程結束 = 進程結束,所有子線程被強制終止
  2. CloseHandle 僅釋放句柄資源,不等待線程結束
  3. 需等待子線程:使用 WaitForSingleObject(hThread, INFINITE) 或 WaitForMultipleObjects
  4. system("pause") 只是阻塞主線程,讓我們看到子線程繼續運行的現象

最佳實踐模板

HANDLE hThread = CreateThread(...);
// ... 主線程工作 ...
WaitForSingleObject(hThread, INFINITE);  // 等待子線程結束
CloseHandle(hThread);  // 釋放句柄
return 0;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved