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
);
| 參數 | 關鍵說明 |
|---|---|
| lpThreadAttributes | NULL 表示默認安全描述符,返回句柄不可被子進程繼承 |
| dwStackSize | 0 = 默認 1MB;內存不足時創建失敗;可後續動態增長 |
| lpStartAddress | 簽名:DWORD WINAPI Func(LPVOID);返回值作為線程退出碼 |
| lpParameter | 32 位值,傳遞任意數據(指針、整數等),需注意類型轉換安全 |
| dwCreationFlags | 0 立即運行;CREATE_SUSPENDED 掛起需 ResumeThread 喚醒 |
| lpThreadId | 接收線程 ID 的變量地址,非線程句柄 |
BOOL CloseHandle(HANDLE hObject); // 關閉句柄,減少內核引用計數,非強制終止線程
#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") 觀察)。
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"),主線程結束導致進程直接退出,子線程被強制終止,無法看到後續輸出CloseHandle 僅釋放句柄資源,不等待線程結束WaitForSingleObject(hThread, INFINITE) 或 WaitForMultipleObjectssystem("pause") 只是阻塞主線程,讓我們看到子線程繼續運行的現象HANDLE hThread = CreateThread(...); // ... 主線程工作 ... WaitForSingleObject(hThread, INFINITE); // 等待子線程結束 CloseHandle(hThread); // 釋放句柄 return 0;