各位讀者好!承接上一期「線程知識體系圖」的講解,今天我們通過一個完整的示例,直觀展示如何使用 POSIX 線程庫(pthread)創建並管理多線程。文末附有完整代碼獲取方式與運行結果分析。
多線程是指一個進程內同時運行兩個或多個線程,它們共享進程的地址空間(堆、全局變量、文件描述符等),但擁有獨立的棧、寄存器上下文與線程 ID。這使得並發執行成為可能,但也帶來了同步與調度的複雜性。
我們將創建 5 個線程,每個線程執行相同的邏輯函數 thread_func,但通過參數傳遞不同的標識字符串,以驗證並發執行效果。
int count = 5;
pthread_t thread_value;
char param[64];
int res;
while (count > 0) {
switch (count) {
case 1: strcpy(param, "This is Thread:1"); break;
case 2: strcpy(param, "This is Thread:2"); break;
case 3: strcpy(param, "This is Thread:3"); break;
case 4: strcpy(param, "This is Thread:4"); break;
case 5: strcpy(param, "This is Thread:5"); break;
default: break;
}
res = pthread_create(&thread_value, NULL, thread_func, (void *)param);
if (0 != res) {
printf("%s ,it can't be created \n", param);
return 1;
}
sleep(1); // 錯開創建時間,便於觀察輸出順序
count--;
}
void *thread_func(void *param) {
int status;
printf("%s \n", (char *)param); // 輸出傳入的標識字符串
pthread_exit(&status); // 正常退出線程
}
pthread_create 的第 4 參數傳遞 void* 指針,線程函數內部強轉回 char* 使用。注意:示例中所有線程共享同一個 param 緩衝區,實際項目中應為每個線程分配獨立內存或使用線程局部存儲,避免數據競爭。pthread_create 返回非 0 表示創建失敗(如資源耗盡),必須檢查返回值。pthread_join,導致主進程可能在子線程結束前退出。生產代碼中應根據需求調用 pthread_join 等待回收資源,或設置線程屬性為分離狀態(PTHREAD_CREATE_DETACHED)。Create multi thread
This is Thread:5
This is Thread:4
This is Thread:3
This is Thread:2
This is Thread:1
輸出順序為 5→4→3→2→1,這反映了線程調度的非確定性:雖然創建順序是 1 到 5,但由於 sleep(1) 錯開了創建時間,且線程啟動、搶佔 CPU 的順序由操作系統調度器決定,故輸出順序與創建順序無關。這正是並發編程的核心特徵——執行順序不可預測。
本例僅演示最基礎的創建與運行。實際開發中,最棘手的是線程同步(互斥鎖、條件變量、信號量)、線程安全數據結構、線程池模型以及調度策略(實時、分時、公平調度等)。後續文章將逐一展開。
完整代碼下載:請訪問我的資源頁面獲取可直接編譯運行的完整源文件。