Skip to content

pthread_cond_signal和pthread_cond_wait簡介

Wei-Lun edited this page Nov 27, 2020 · 1 revision

pthread_cond_wait() 用於阻塞當前線程,等待別的線程使用pthread_cond_signal()或pthread_cond_broadcast來喚醒它。 pthread_cond_wait() 必須與pthread_mutex配套使用。
pthread_cond_wait() 函數一進入wait狀態就會自動release mutex。
當其他線程通過pthread_cond_signal() 或pthread_cond_broadcast ,把該線程喚醒,使pthread_cond_wait()通過(返回)時,該線程又自動獲得該mutex 。
pthread_cond_signal 函數的作用是發送一個信號給另外一個正在處於阻塞等待狀態的線程,使其脫離阻塞狀態,繼續執行. 如果沒有線程處在阻塞等待狀態,pthread_cond_signal也會成功返回。

使用pthread_cond_signal一般不會有"驚群現象"產生,他最多只給一個線程發信號。
假如有多個線程正在阻塞等待著這個條件變量的話,那麼是根據各等待線程優先級的高低確定哪個線程接收到信號開始繼續執行。
如果各線程優先級相同,則根據等待時間的長短來確定哪個線程獲得信號。但無論如何一個pthread_cond_signal調用最多發信一次。

但是pthread_cond_signal 在多處理器上可能同時喚醒多個線程,當你只能讓一個線程處理某個任務時, 其它被喚醒的線程就需要繼續wait,而且規範要求pthread_cond_signal 至少喚醒一個pthread_cond_wait上的線程, 其實有些實現為了簡單在單處理器上也會喚醒多個線程.

另外,某些應用,如線程池,pthread_cond_broadcast 喚醒全部線程,但我們通常只需要一部分線程去做執行任務,所以其它的線程需要繼續wait.所以強烈推薦對pthread_cond_wait()使用while循環來做條件判斷.

Consider two shared variables x and y, protected by the mutex mut, and a condition vari- able cond that is to be signaled whenever x becomes greater than y.

              int x , y ;
              pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER ;
              pthread_cond_t cond = PTHREAD_COND_INITIALIZER ;

       Waiting until x is greater than y is performed as follows:
              pthread_mutex_lock (& mut );
              while  ( x <= y )  {
                      pthread_cond_wait (& cond ,  & mut );
              }
              /* operate on x and y */
              pthread_mutex_unlock (& mut );

       Modifications on x and y that may cause x to become greater than y should signal the con-
       dition if needed:

http://www.eefocus.com/andrew_dj/blog/12-08/282740_85e58.html

Clone this wiki locally