推薦的pthread_cond_wait()和pthread_cond_signal()使用方式: 另一端一般是: 注意調用pthread_cond_wait()之前必須獲得鎖。pthread_cond_wait()其實(shí)對互斥量做了操作,首先,將解鎖與掛起線(xiàn)程做為原子操作執行,這樣pthread_cond_signal()即可獲互斥量。當pthread_cond_wait()返回時(shí),又會(huì )自動(dòng)加鎖,所以其效果相當于持有的鎖的狀態(tài)沒(méi)有改變。 被pthread_cond_wait()阻塞的線(xiàn)程可以被pthread_cond_signal函數,pthread_cond_broadcast函數喚醒,也可能在被信號中斷后被喚醒(造成假喚醒)。pthread_cond_wait()函數的返回并不意味著(zhù)條件的值一定發(fā)生了變化(有可能是假喚醒),也可能是函數出錯返回,因此必須重新檢查條件的值,比如用while()來(lái)確認。pthread_cond_wait()函數返回時(shí),相應的互斥鎖將被當前線(xiàn)程鎖定。 必須在互斥鎖的保護下使用相應的條件變量。否則對條件變量的通知有可能發(fā)生在等待條件變量之前,從而造成死鎖;導致死鎖的最常見(jiàn)錯誤是自死鎖或遞歸死鎖。在自死鎖或遞歸死鎖中,線(xiàn)程嘗試獲取已被其持有的鎖。遞歸死鎖是在編程時(shí)很容易犯的錯誤。另外,如果沒(méi)有線(xiàn)程被阻塞在條件變量上,那么調用pthread_cond_signal()將沒(méi)有作用。 也可以用int pthread_cond_timedwait(),函數到了一定的時(shí)間,即使條件未發(fā)生也會(huì )解除阻塞(返回ETIMEDOUT)。函數返回時(shí),相應的互斥鎖往往是鎖定的,即使是函數出錯返回。 對于pthread_cond_broadcast(),不同的線(xiàn)程可以共用一個(gè)條件變量,但是鎖還是要不同的,因為在wait()之前一定要獲得鎖;如果確認對鎖沒(méi)有造成死鎖的競爭,pthread_cond_broadcast()的方式用一個(gè)鎖也可以。 PS: 條件變量函數并不是異步信號安全的,因此不能在信號處理函數中調用。具體地說(shuō),在信號處理函數中調用 pthread_cond_signal() 或 pthread_cond_broadcast() 可能會(huì )導致調用線(xiàn)程的死鎖。 |
聯(lián)系客服