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

pthread_mutex_init() 互斥鎖完整範例:多執行緒同步化實戰

     編輯:關於C

程式碼結構說明

範例展示兩個執行緒共享全域計數器 counter,透過互斥鎖保護臨界區,避免競爭條件。

關鍵程式碼片段

#include 
#include 
#include 

pthread_mutex_t mutex;
int counter = 0;

void *function(void *arg) {
    char *str = (char *)arg;
    for (int i = 0; str[i]; ++i) {
        pthread_mutex_lock(&mutex);
        putchar(str[i]);
        fflush(stdout);
        ++counter;
        pthread_mutex_unlock(&mutex);
        sleep(1); // 模擬工作
    }
    return NULL;
}

int main(void) {
    pthread_mutex_init(&mutex, NULL);

    pthread_t t1, t2;
    pthread_create(&t1, NULL, function, "fulinux");
    pthread_create(&t2, NULL, function, "wansui!");

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);
    printf("\nFinal counter: %d\n", counter);
    return 0;
}

編譯與執行

gcc thread_mutex.c -o thread -lpthread
./thread
# 輸出交錯顯示:f u l i n u x w a n s u i ! (每字元間隔 1 秒)

核心 API 解析

函式用途
pthread_mutex_init(&mutex, NULL)初始化互斥鎖,屬性用預設值
pthread_mutex_lock(&mutex)鎖定,若已被鎖則阻塞等待
pthread_mutex_unlock(&mutex)解鎖,喚醒等待執行緒
pthread_mutex_destroy(&mutex)銷毀鎖,釋放資源
pthread_create()建立執行緒
pthread_join()等待執行緒結束

常見錯誤與最佳實踐

  • ❌ 忘記初始化:未初始化的 mutex 行為未定義。
  • ❌ 鎖定後未解鎖:導致死鎖,務必配對,或用 pthread_cleanup_push 保護。
  • ✅ 鎖定範圍最小化:只保護共享資源存取,不要把 sleep()、I/O 放在鎖內。
  • ✅ 檢查回傳值:所有 pthread 函式都回傳錯誤碼,生產級程式碼必須檢查。
  • ✅ 使用 RAII 風格封裝:C++ 可用 std::lock_guard;C 可自寫宏自動配對 lock/unlock。

進階:錯誤處理版本

int rc = pthread_mutex_lock(&mutex);
if (rc != 0) { fprintf(stderr, "lock failed: %s\n", strerror(rc)); exit(1); }
// ... critical section ...
rc = pthread_mutex_unlock(&mutex);
if (rc != 0) { fprintf(stderr, "unlock failed: %s\n", strerror(rc)); exit(1); }
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved