| 特性 | mutex | cond |
|---|---|---|
| 進入臨界區 | 單線程 | 多線程可等待 |
| 喚醒機制 | 無(靠解鎖) | signal/broadcast 主動喚醒 |
| 典型用途 | 保護共享數據 | 等待特定條件成立 |
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
...
pthread_cond_wait 自動解鎖/加鎖:調用時必須持有鎖,返回時仍持有鎖。signal vs broadcast:單消費者用 signal,多消費者或條件廣播用 broadcast。timedwait 返回 ETIMEDOUT,需重新檢查條件。not_empty / not_full。wait(not_empty),主線程 push + signal(not_empty)。shutdown 標誌,broadcast(not_empty) 喚醒所有線程退出。pthread_cond 是「等待-通知」模式的核心原語。配合互斥鎖保護共享狀態,配合 while 循環檢查條件,能構建高效、正確的線程協作系統(生產者-消費者、線程池、屏障、信號量等)。