2015-11-27 74 views
0

我知道:`pthread_mutex_lock`和`pthread_cond_wait`是否在同一個隊列中等待?

  • 如果所有者線程調用pthread_mutex_unlock,它會喚醒是互斥阻塞線程。
  • 如果所有者線程調用pthread_cond_wait,它會以原子方式釋放互斥鎖並等待。
  • 如果所有者線程想要喚醒一個線程睡眠上的條件變量,它會做pthread_cond_signalpthread_mutex_unlock

爲什麼我們需要pthread_cond_signal如果pthread_mutex_unlock本身可以喚醒那些阻塞線程?

+2

當'pthread_cond_wait'塊(需要等待)時,它釋放互斥量。換句話說,'pthread_cond_wait'不會在互斥體上被阻塞,因此解鎖互斥體對調用'pthread_cond_wait'的線程沒有影響。實際上,建議但不要求'pthread_cond_signal'調用者鎖定互斥鎖。真正需要互斥鎖來同步同一個條件變量上阻塞的多個線程。 – kaylum

+0

@kaylum謝謝。它是否意味着'pthread_cond_wait'把調用者放在它的條件變量的等待隊列中(互斥量除外)?在'pthread_cond_signal'之前調用'pthread_mutex_unlock'更好嗎? – Amos

+0

是的第一個問題。但我不明白第二個問題。'pthread_cond_signal'本身並不鎖定互斥鎖。但是,如果你的代碼在調用信號之前明確地鎖定了互斥鎖,那麼它不僅更好,而且它必須解鎖互斥鎖(通常在信號之後,但甚至可以在之前)。否則,等待的任何人都不會解鎖。也就是說,一個解鎖的互斥量是必需的,但不足以解除阻塞'pthread_cond_wait'。 – kaylum

回答

0

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()無法解鎖互斥體,這就是爲什麼互斥必須解鎖才能完成情況例程。

+1

這不是我要求的。 – Amos

+0

對不起,我只看了你的第二個問題忘了回答第一個問題。我更新了你的兩個問題的答案。我希望這是你所要求的。 –

相關問題