多線程編程指南 pthread_cond_wait 語法int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex); #include <pthread.h>
pthread_cond_t cv;
pthread_mutex_t mp;
int ret;
/* wait on condition variable */
ret = pthread_cond_wait(&cv, &mp); 阻塞的線程可以通過 pthread_cond_signal() 或 pthread_cond_broadcast() 喚醒,也可以在信號(hào)傳送將其中斷時(shí)喚醒。 不能通過 pthread_cond_wait() 的返回值來推斷與條件變量相關(guān)聯(lián)的條件的值的任何變化。必須重新評(píng)估此類條件。 pthread_cond_wait() 例程每次返回結(jié)果時(shí)調(diào)用線程都會(huì)鎖定并且擁有互斥鎖,即使返回錯(cuò)誤時(shí)也是如此。 該條件獲得信號(hào)之前,該函數(shù)一直被阻塞。該函數(shù)會(huì)在被阻塞之前以原子方式釋放相關(guān)的互斥鎖,并在返回之前以原子方式再次獲取該互斥鎖。 通常,對(duì)條件表達(dá)式的評(píng)估是在互斥鎖的保護(hù)下進(jìn)行的。如果條件表達(dá)式為假,線程會(huì)基于條件變量阻塞。然后,當(dāng)該線程更改條件值時(shí),另一個(gè)線程會(huì)針對(duì)條件變量發(fā)出信號(hào)。這種變化會(huì)導(dǎo)致所有等待該條件的線程解除阻塞并嘗試再次獲取互斥鎖。 必須重新測(cè)試導(dǎo)致等待的條件,然后才能從 pthread_cond_wait() 處繼續(xù)執(zhí)行。喚醒的線程重新獲取互斥鎖并從 pthread_cond_wait() 返回之前,條件可能會(huì)發(fā)生變化。等待線程可能并未真正喚醒。建議使用的測(cè)試方法是,將條件檢查編寫為調(diào)用 pthread_cond_wait() 的while() 循環(huán)。 pthread_mutex_lock();
while(condition_is_false)
pthread_cond_wait();
pthread_mutex_unlock(); 如果有多個(gè)線程基于該條件變量阻塞,則無法保證按特定的順序獲取互斥鎖。 注 –pthread_cond_wait() 是取消點(diǎn)。如果取消處于暫掛狀態(tài),并且調(diào)用線程啟用了取消功能,則該線程會(huì)終止,并在繼續(xù)持有該鎖的情況下開始執(zhí)行清除處理程序。
|