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

C語言 _beginthread 用法詳解:參數、調用約定、棧大小、錯誤處理

     編輯:C 語言問答

函數原型 (MSVC)


#include   // 非標準,Windows 專用
uintptr_t _beginthread(
    void (__cdecl *start_address)(void*),  // 線程入口函數,必須 __cdecl
    unsigned stack_size,                   // 棧大小 (字節),0 = 默認 1MB
    void *arglist                          // 傳遞給入口函數的參數
);

核心規則

  1. 調用約定必須 __cdecl:MSVC 默認即為 __cdecl,若顯式聲明 __stdcall/__fastcall 會崩潰;
  2. 入口函數簽名固定:void func(void* arg),返回 void,單參數 void*;
  3. 返回值:成功返回線程句柄 (可轉 HANDLE),失敗返回 -1 (設 errno);
  4. 線程結束:入口函數 return 或 _endthread() 自動釋放句柄,**無需** CloseHandle (與 CreateThread 不同);
  5. 棧大小:建議保持 0 (默認 1MB),除非極深遞歸/大局部數組需調大。

標準用法範例


#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 vs CreateThread vs std::thread

特性_beginthreadCreateThreadstd::thread (C++11)
C 語言兼容是是否 (需 C++)
CRT 初始化**自動** 初始化線程局部存儲**不自動**,需手動或用 _beginthreadex自動
句柄管理自動關閉 (線程結束即釋放)**需手動 CloseHandle**RAII 管理 (析構函數 join/detach)
參數傳遞單 void*單 void*可變參數模板 (類型安全)
異常處理不支持 C++ 異常跨線程不支持支持 (需 join 捕獲)
推薦場景純 C 代碼、簡單任務、老項目維護需精細控制安全屬性/掛起創建**現代 C++ 首選**

進階:_beginthreadex (推薦替代 _beginthread)


#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)。

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