pthread_cond_wait()會阻塞調用線程,直到發出特定條件爲止。應該在互斥鎖被鎖定時調用此例程,並且它會在等待時自動釋放互斥量。接收到信號後,線程將被喚醒,互斥量將爲線程自動使用。線程完成後,程序員需要注意解鎖互斥鎖。
調用pthread_mutex_unlock(互斥)當線程完成使用受保護數據。當程序員的用於要解鎖的互斥沒有這個應該可以使用任何條件。
pthread_cond_signal(condition)用於發送(或喚醒)等待條件變量的另一個線程。這隻能在只有一個線程處於阻塞等待狀態時使用。對於多於一個線程處於阻塞等待狀態,比pthread_cond_broadcast(condition)例程被使用。
爲什麼我們需要調用pthread_cond_signal如果調用pthread_mutex_unlock本身可以 喚醒那些阻塞線程?
看看這段代碼來理解你的問題
for (i=0; i<TCOUNT; i++) {
pthread_mutex_lock(&count_mutex);
count++;
/*
Check the value of count and signal waiting thread when condition is
reached. Note that this occurs while mutex is locked.
*/
if (count == COUNT_LIMIT) {
pthread_cond_signal(&count_threshold_cv);
printf("inc_count(): thread %ld, count = %d Threshold reached.\n",
my_id, count);
}
printf("inc_count(): thread %ld, count = %d, unlocking mutex\n",
my_id, count);
pthread_mutex_unlock(&count_mutex);
}
/* Do some "work" so threads can alternate on mutex lock */
sleep(1);
}
pthread_exit(NULL);
的pthread_mutex_lock對於
pthread_mutex_lock (&mutex);
str.mul *= mymul; /*Do some process on protected data*/
pthread_mutex_unlock (&mutex);
在第一碼互斥體已被調用pthread_cond_signal()如果條件滿足解鎖。 在第二個代碼沒有條件直接互斥將被解鎖在這種類型的,你可以使用調用pthread_mutex_unlock()
一兩件事,有時會調用pthread_cond_signal()無法解鎖互斥體,這就是爲什麼互斥必須解鎖才能完成情況例程。
當'pthread_cond_wait'塊(需要等待)時,它釋放互斥量。換句話說,'pthread_cond_wait'不會在互斥體上被阻塞,因此解鎖互斥體對調用'pthread_cond_wait'的線程沒有影響。實際上,建議但不要求'pthread_cond_signal'調用者鎖定互斥鎖。真正需要互斥鎖來同步同一個條件變量上阻塞的多個線程。 – kaylum
@kaylum謝謝。它是否意味着'pthread_cond_wait'把調用者放在它的條件變量的等待隊列中(互斥量除外)?在'pthread_cond_signal'之前調用'pthread_mutex_unlock'更好嗎? – Amos
是的第一個問題。但我不明白第二個問題。'pthread_cond_signal'本身並不鎖定互斥鎖。但是,如果你的代碼在調用信號之前明確地鎖定了互斥鎖,那麼它不僅更好,而且它必須解鎖互斥鎖(通常在信號之後,但甚至可以在之前)。否則,等待的任何人都不會解鎖。也就是說,一個解鎖的互斥量是必需的,但不足以解除阻塞'pthread_cond_wait'。 – kaylum