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

深入理解 pthread_cond_wait:條件變量與互斥鎖的正確協作模式

     編輯:關於C語言

為什麼需要 while 迴圈檢查條件?

在多線程同步中,pthread_cond_wait() 是等待條件變量的標準方式。典型用法如下:

pthread_mutex_lock(&mtx);
while (head != NULL) {
    pthread_cond_wait(&cond, &mtx);
}
// 條件滿足,執行邏輯...
pthread_mutex_unlock(&mtx);

核心機制解析

  1. 原子釋放鎖並等待:線程調用 pthread_cond_wait 時,會自動釋放互斥鎖並進入等待狀態,這兩步是原子的。
  2. 喚醒後重新獲取鎖:當其他線程發送信號(signal 或 broadcast)後,等待線程被喚醒,但必須重新獲得互斥鎖才能繼續執行。
  3. 虛假喚醒與競態條件:在線程重新獲取鎖的間隙,其他線程可能搶先獲得鎖並修改共享變量,導致條件不再滿足。此外,POSIX 標準允許「虛假喚醒」(spurious wakeup),即線程在無信號情況下被喚醒。

為什麼用 while 而非 if?

while (head != NULL) 確保線程喚醒後重新檢查條件。若條件不滿足,再次釋放鎖並進入等待。這樣能同時應對:

  • 虛假喚醒
  • 信號發送後、鎖獲取前,其他線程修改了共享變量
  • 多線程競爭同一條件變量(「驚群效應」)

完整示例上下文

struct xxx* head; // 全局共享變量
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

static void* thread_func(void* arg) {
    pthread_mutex_lock(&mtx);
    while (head != NULL) {
        pthread_cond_wait(&cond, &mtx);
    }
    // head == NULL 時的處理邏輯
    pthread_mutex_unlock(&mtx);
    return NULL;
}

注意:此處的「信號」指線程間的條件變量通知機制,非 Unix 信號。

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