pthread_cond_signal和pthread_cond_wait簡介

pthread_cond_signal函數的做用是發送一個信號給另一個正在處於阻塞等待狀態的線程,使其脫離阻塞狀態,繼續執行.若是沒有線程處在阻塞等待狀態,pthread_cond_signal也會成功返回。
但使用pthread_cond_signal不會有「驚羣現象」產生,他最多隻給一個線程發信號。假若有多個線程 正在阻塞等待着這個條件變量的話,那麼是根據各等待線程優先級的高低肯定哪一個線程接收到信號開始繼續執行。若是各線程優先級相同,則根據等待時間的長短來 肯定哪一個線程得到信號。但不管如何一個pthread_cond_signal調用最多發信一次。
另外,互斥量的做用通常是用於對某個資源進行互斥性的存取,不少時候是用來保證操做是一個原子性的操做,是不可中斷的。
用法:
pthread_cond_wait必須放在pthread_mutex_lock和pthread_mutex_unlock之間,由於他要根據共享變量的狀態來決定是否要等待,而爲了避免永遠等待下去因此必需要在lock/unlock隊中
共享變量的狀態改變必須遵照lock/unlock的規則
pthread_cond_signal便可以放在pthread_mutex_lock和pthread_mutex_unlock之間,也能夠放在pthread_mutex_lock和pthread_mutex_unlock以後,可是各有各缺點。
之間:
pthread_mutex_lock
xxxxxxx
pthread_cond_signal
pthread_mutex_unlock
缺點:在某下線程的實現中,會形成等待線程從內核中喚醒(因爲cond_signal)而後又回到內核空間(由於 cond_wait返回後會有原子加鎖的行爲),因此一來一回會有性能的問題。可是在LinuxThreads或者NPTL裏面,就不會有這個問題,由於 在Linux 線程中,有兩個隊列,分別是cond_wait隊列和mutex_lock隊列, cond_signal只是讓線程從cond_wait隊列移到mutex_lock隊列,而不用返回到用戶空間,不會有性能的損耗。
因此在Linux中推薦使用這種模式。
以後:
pthread_mutex_lock
xxxxxxx
pthread_mutex_unlock
pthread_cond_signal
優勢:不會出現以前說的那個潛在的性能損耗,由於在signal以前就已經釋放鎖了
缺點:若是unlock和signal以前,有個低優先級的線程正在mutex上等待的話,那麼這個低優先級的線程就會搶佔高優先級的線程(cond_wait的線程),而這在上面的放中間的模式下是不會出現的。

因此,在Linux下最好pthread_cond_signal放中間,但從編程規則上說,其餘兩種均可以. 編程


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循環來作條件判斷.
相關文章
相關標籤/搜索