2014-06-10 94 views
0

我發現這個上SO here等待條件變量

void mrevent_wait(struct mrevent *ev) { 
    pthread_mutex_lock(&ev->mutex); 
    while (!ev->triggered) 
     pthread_cond_wait(&ev->cond, &ev->mutex); 
    pthread_mutex_unlock(&ev->mutex); 
} 

的手冊頁賽斯:

的調用pthread_cond_wait()和那麼pthread_cond_timedwait()函數用於在條件變量阻塞。它們被調用線程鎖定的互斥鎖調用,否則會導致未定義的行爲。

這些函數以原子方式釋放互斥鎖並導致調用線程在條件變量cond上阻塞;

那麼在每次調用pthread_cond_wait之前都不應該捕獲互斥鎖。另外,爲什麼在手冊頁中解釋了互斥體,pthread_cond_wait爲您做了這些。

回答

0

您正在閱讀的文檔有點不對。它所說的是,在pthread_cond_wait()的調用中,互斥鎖被解鎖(這是必需的,否則pthread_cond_signal()pthread_cond_broadcast()將永遠不能觸發條件變量)。條件變量被觸發後,互斥將在pthread_cond_wait()返回之前被重新鎖定。這就是你必須再解鎖它的原因。

由於pthread_cond_wait()在返回給您之前需要重新獲取互斥鎖,所以可能有其他線程可能首先獲取互斥鎖,這意味着到pthread_cond_wait()返回給您時,您等待的條件可能會已經通過了,這就是爲什麼你必須測試while循環中的條件。