#include // 非標準,Windows 專用
uintptr_t _beginthread(
void (__cdecl *start_address)(void*), // 線程入口函數,必須 __cdecl
unsigned stack_size, // 棧大小 (字節),0 = 默認 1MB
void *arglist // 傳遞給入口函數的參數
);
__cdecl:MSVC 默認即為 __cdecl,若顯式聲明 __stdcall/__fastcall 會崩潰;void func(void* arg),返回 void,單參數 void*;HANDLE),失敗返回 -1 (設 errno);return 或 _endthread() 自動釋放句柄,**無需** CloseHandle (與 CreateThread 不同);
#include
#include
#include
#include
typedef struct {
int id;
const char* msg;
} ThreadArg;
void __cdecl worker(void* arg) {
ThreadArg* p = (ThreadArg*)arg;
for (int i = 0; i < 5; i++) {
printf("Thread %d: %s - %d\n", p->id, p->msg, i);
Sleep(100);
}
free(p); // 線程內部釋放參數內存
}
int main() {
for (int i = 0; i < 3; i++) {
ThreadArg* arg = malloc(sizeof(ThreadArg));
arg->id = i;
arg->msg = "Hello";
uintptr_t handle = _beginthread(worker, 0, arg);
if (handle == -1) {
perror("_beginthread failed");
free(arg);
} else {
printf("Started thread %d (handle=%p)\n", i, (void*)handle);
}
}
Sleep(1000); // 等待子線程結束 (生產環境用 WaitForMultipleObjects)
return 0;
}
| 特性 | _beginthread | CreateThread | std::thread (C++11) |
|---|---|---|---|
| C 語言兼容 | 是 | 是 | 否 (需 C++) |
| CRT 初始化 | **自動** 初始化線程局部存儲 | **不自動**,需手動或用 _beginthreadex | 自動 |
| 句柄管理 | 自動關閉 (線程結束即釋放) | **需手動 CloseHandle** | RAII 管理 (析構函數 join/detach) |
| 參數傳遞 | 單 void* | 單 void* | 可變參數模板 (類型安全) |
| 異常處理 | 不支持 C++ 異常跨線程 | 不支持 | 支持 (需 join 捕獲) |
| 推薦場景 | 純 C 代碼、簡單任務、老項目維護 | 需精細控制安全屬性/掛起創建 | **現代 C++ 首選** |
#include
uintptr_t _beginthreadex(
void* security, unsigned stack_size,
unsigned (__stdcall *start_address)(void*),
void* arglist, unsigned initflag, unsigned* thrdaddr
);
// 入口函數返回 unsigned (線程退出碼),支持 __stdcall,需手動 CloseHandle
**最佳實踐**:純 C 項目用 _beginthreadex + 手動 CloseHandle;C++ 項目直接用 std::thread/std::jthread (C++20)。