pthread_cond_wait的使用:html
pthread_mutex_t qlock; pthread_cond_t qready; /************pthread_cond_wait()的使用方法**********/ pthread_mutex_lock(&qlock); /*lock*/ //等待某資源,並以qready做爲條件通知咱們 while (condition == FALSE){ pthread_cond_wait(&qready, &qlock); /*block-->unlock-->wait() return-->lock*/ } //do something pthread_mutex_unlock(&qlock); /*unlock*/ /*****************************************************/
使用while循環來判斷條件是否成立的緣由:pthread_cond_signal在多處理器上可能同時喚醒多個線程,當你只能讓一個線程處理某個任務時,其它被喚醒的線程就須要繼續 wait, while循環的意義就體如今這裏了,並且規範要求pthread_cond_signal至少喚醒一個pthread_cond_wait上的線程,其實有些實現爲了簡單在單處理器上也會喚醒多個線程. 某些應用,如線程池,pthread_cond_broadcast喚醒所有線程,但咱們一般只須要一部分線程去作執行任務,因此其它的線程須要繼續wait.因此強烈推薦此處使用while循環. (驚羣效應)
pthread_cond_signal喚醒信號可能丟失:pthread_cond_signal函數的做用是發送一個信號給另一個正在處於阻塞等待狀態的線程,使其脫離阻塞狀態,繼續執行.若是沒有線程處在阻塞等待狀態, pthread_cond_signal也會成功返回,在這種狀況下,該喚醒信號丟失。因此,若是程序是嚴格依賴pthread_cond_signal來作同步的,必須保證該條件量已經處於阻塞wait狀態。如下是一個喚醒信號丟失的例子:
Thread A:編程
pthread_mutex_lock(&mutex); while (condition == FALSE) pthread_cond_wait(&cond, &mutex); pthread_mutex_unlock(&mutex);
Thread B:函數
condition = TRUE;
pthread_cond_signal(&cond);
那麼可能出現這樣的狀況:性能
thread A thread B pthread_mutex_lock(&mutex); while (condition == FALSE) condition = TRUE; pthread_cond_signal(&cond); pthread_cond_wait(&cond, &mutex);
pthread_cond_signal的使用:
第一種:ui
pthread_mutex_lock
......
pthread_cond_signal
pthread_mutex_unlock
缺點:在某下線程的實現中,會形成等待線程從內核中喚醒(因爲cond_signal)而後又回到內核空間(由於cond_wait返回後會有原子加鎖的行爲),因此一來一回會有性能的問題。可是在LinuxThreads或者NPTL裏面,就不會有這個問題,由於在Linux 線程中,有兩個隊列,分別是cond_wait隊列和mutex_lock隊列, cond_signal只是讓線程從cond_wait隊列移到mutex_lock隊列,而不用返回到用戶空間,不會有性能的損耗。因此在Linux中推薦使用這種模式。
第二種:spa
pthread_mutex_lock
......
pthread_mutex_unlock
pthread_cond_signal
優勢:不會出現以前說的那個潛在的性能損耗,由於在signal以前就已經釋放鎖了
缺點:若是unlock和signal以前,有個低優先級的線程正在mutex上等待的話,那麼這個低優先級的線程就會搶佔高優先級的線程(cond_wait的線程),而這在上面的放中間的模式下是不會出現的。線程
因此,在Linux下最好pthread_cond_signal放中間,但從編程規則上說,其餘兩種均可以。code
參考:htm