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

C語言多線程實戰:基於 pthread 的並發編程入門

     編輯:關於C語言

C語言多線程實戰:基於 pthread 的並發編程入門

各位讀者好!承接上一期「線程知識體系圖」的講解,今天我們通過一個完整的示例,直觀展示如何使用 POSIX 線程庫(pthread)創建並管理多線程。文末附有完整代碼獲取方式與運行結果分析。

核心概念回顧

多線程是指一個進程內同時運行兩個或多個線程,它們共享進程的地址空間(堆、全局變量、文件描述符等),但擁有獨立的棧、寄存器上下文與線程 ID。這使得並發執行成為可能,但也帶來了同步與調度的複雜性。

示例場景:創建 5 個工作線程

我們將創建 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);           // 正常退出線程
}

關鍵點解析

  1. 參數傳遞:主線程通過 pthread_create 的第 4 參數傳遞 void* 指針,線程函數內部強轉回 char* 使用。注意:示例中所有線程共享同一個 param 緩衝區,實際項目中應為每個線程分配獨立內存或使用線程局部存儲,避免數據競爭。
  2. 錯誤檢查:pthread_create 返回非 0 表示創建失敗(如資源耗盡),必須檢查返回值。
  3. 線程分離/等待:示例中主線程未調用 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 的順序由操作系統調度器決定,故輸出順序與創建順序無關。這正是並發編程的核心特徵——執行順序不可預測。

進階話題預告

本例僅演示最基礎的創建與運行。實際開發中,最棘手的是線程同步(互斥鎖、條件變量、信號量)、線程安全數據結構、線程池模型以及調度策略(實時、分時、公平調度等)。後續文章將逐一展開。

完整代碼下載:請訪問我的資源頁面獲取可直接編譯運行的完整源文件。

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