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

pthread_cond 條件變量詳解與線程池雛形

     編輯:關於C語言

條件變量 vs 互斥鎖

特性mutexcond
進入臨界區單線程多線程可等待
喚醒機制無(靠解鎖)signal/broadcast 主動喚醒
典型用途保護共享數據等待特定條件成立

核心 API

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);
// 原子操作:解鎖 mutex + 進入等待隊列;被喚醒後重新加鎖

int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex,
                           const struct timespec* abstime);
// 帶超時版本

int pthread_cond_signal(pthread_cond_t* cond);   // 喚醒至少一個等待線程
int pthread_cond_broadcast(pthread_cond_t* cond); // 喚醒所有等待線程

經典模式:生產者-消費者 / 線程池雛形

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int val = 0;

void* zero_thread(void*) {
    while (true) {
        pthread_mutex_lock(&mutex);
        while (val <= 2) {                 // 雙重檢查模式
            printf("zero wait val=%d\n", val);
            pthread_cond_wait(&cond, &mutex);
        }
        printf("zero reset val=%d\n", val);
        val = 0;
        pthread_mutex_unlock(&mutex);
    }
}

void* add_thread(void*) {
    while (true) {
        pthread_mutex_lock(&mutex);
        ++val;
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&cond);        // 喚醒一個 zero_thread
        printf("add val=%d, signalled\n", val);
        sleep(1);
    }
}

int main() {
    pthread_t t_add, t_zero;
    pthread_create(&t_add, NULL, add_thread, NULL);
    pthread_create(&t_zero, NULL, zero_thread, NULL);
    pthread_join(t_add, NULL);
    pthread_join(t_zero, NULL);
    return 0;
}

運行輸出片段

add val=1, signalled
zero wait val=1
add val=2, signalled
zero wait val=2
add val=3, signalled
zero reset val=3
zero wait val=0
add val=1, signalled
...

關鍵細節

  1. while 而非 if 檢查條件:防止虛假喚醒,確保條件真正滿足再繼續。
  2. pthread_cond_wait 自動解鎖/加鎖:調用時必須持有鎖,返回時仍持有鎖。
  3. signal vs broadcast:單消費者用 signal,多消費者或條件廣播用 broadcast。
  4. 超時處理:timedwait 返回 ETIMEDOUT,需重新檢查條件。

擴展到線程池

  • 任務隊列 + 條件變量 not_empty / not_full。
  • 工作線程 wait(not_empty),主線程 push + signal(not_empty)。
  • 優雅關閉:設置 shutdown 標誌,broadcast(not_empty) 喚醒所有線程退出。

總結

pthread_cond 是「等待-通知」模式的核心原語。配合互斥鎖保護共享狀態,配合 while 循環檢查條件,能構建高效、正確的線程協作系統(生產者-消費者、線程池、屏障、信號量等)。

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