pthread cond t條件變數

2021-06-18 08:31:20 字數 2992 閱讀 8281

條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:乙個執行緒等待"條件變數的條件成立"而掛起;另乙個執行緒使"條件成立"(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。 

一 pthread_cond_wait定義: 

函式原型:int   pthread_cond_wait(pthread_cond_t   *cond,   pthread_mutex_t   *mutex)   

引數: cond 條件變數  mutex 互斥鎖 

第乙個引數*cond是指向乙個條件變數的指標。第二個引數*mutex則是對相關的互斥鎖的指標。 

二 pthread_cond_wait示例理解 

pthread_cond_wait的機制比較難裡理解,是條件變數中重要的成分。條件變數用於執行緒間同步,那麼pthread_cond_wait必須和互斥鎖同時作用在乙個執行緒裡,它同時起到對資源的加鎖和解鎖,看下面的示例: 

程式建立了2個新執行緒使他們同步執行,實現程序t_b列印9以內3的倍數,t_a列印其他的數,程式開始執行緒t_b不滿足條件等待,執行緒t_a執行使a迴圈加1並列印。直到i為3的倍數時,執行緒t_a傳送訊號通知程序t_b,這時t_b滿足條件,列印i值。 

1 #include2 #include3 #include4 #include5 

6 pthread_mutex_t mutex = pthread_mutex_initializer;/*初始化互斥鎖*/

7 pthread_cond_t  cond = pthread_cond_initializer;//init cond

8 9 void *thread1(void*);

10 void *thread2(void*);

11 12 int i = 1; //global

13 14 int main(void)

26 27 void *thread1(void *junk)

38 }

39 40 void *thread2(void*junk)

51 }

輸出: 

call thread2 

call thread1 

thread1: 1 

call thread1 

thread1: 2 

call thread1 

thread2: 3 

call thread1 

thread1: 4 

call thread2 

call thread1 

thread1: 5 

call thread1 

thread2: 6 

call thread1 

thread1: 7 

call thread2 

call thread1 

thread1: 8 

call thread1 

thread2: 9 

示例的解釋: 

call thread2:是執行緒2即t_b首先上鎖,即 pthread_mutex_lock(&mutex);鎖住了mutex使得此程序執行執行緒2中的臨界區的**,當執行到45行:if(i%3 != 0),此時i=1,滿足此條件,則執行46行: pthread_cond_wait(&cond,&mutex); 這句是關鍵,pthread_cond_wait(&cond,&mutex)操作有兩步,是原子操作:第一 解鎖,先解除之前的pthread_mutex_lock鎖定的mutex;第二 掛起,阻塞並在等待對列裡休眠,即執行緒2掛起,直到再次被喚醒,喚醒的條件是由pthread_cond_signal(&cond);發出的cond訊號來喚醒。 

call thread1:由於pthread_cond_wait已經對執行緒2解鎖,此時另外的執行緒只有執行緒1,那麼執行緒1對mutex上鎖,若這時有多個執行緒,那麼執行緒間上鎖的順序和作業系統有關。 

thread1: 1:執行緒1上鎖後執行臨界區的**,當執行到if(i%3 == 0)此時i=1,不滿足條件,則pthread_cond_signal(&cond);不被執行,那麼執行緒2仍處於掛起狀態,輸出thread1: 1後執行緒1由pthread_mutex_unlock(&mutex);解鎖。 

thread1: 2:這時此程序中只有2個執行緒,執行緒2處於掛起狀態,那麼只有執行緒1,則執行緒1又對mutex上鎖,此時同樣執行臨界區的**,而且i=2,不滿足條件,pthread_cond_signal(&cond);不被執行,那麼執行緒2仍處於掛起狀態,輸出thread1: 1後執行緒1由pthread_mutex_unlock(&mutex);解鎖。 

call thread1:同樣由執行緒1上鎖,但此時i=3,滿足條件pthread_cond_signal(&cond)被執行,那麼pthread_cond_signal(&cond)會發出訊號,來喚醒處於掛起的執行緒2。pthread_cond_signal同樣由兩個原子操作:1,解鎖;2,傳送訊號;解鎖即對執行緒1解鎖,解除對mutex的上鎖。傳送訊號,即給等待signal掛起的執行緒2傳送訊號,喚醒掛起的執行緒2。(錯誤)

pthread_cond_signal只會傳送資訊,讓pthread_cond_wait執行緒從cond_wait佇列轉移至mutex_wait佇列。 

thread2: 3:由於pthread_cond_signal喚醒了執行緒2,即i=3滿足條件,pthread_cond_wait(&cond,&mutex);被執行,那麼pthread_cond_wait(&cond,&mutex)此時也有一步操作:上鎖;即對執行緒2上鎖,此時的pthread_cond_wait(&cond,&mutex)的操作相當與pthread_mutex_lock(&mutex);那麼執行緒2繼續執行上鎖後的臨界區的**,並由pthread_mutex_unlock(&mutex);對執行緒2進行解鎖。 

剩下的輸出原理和上面解釋的一樣。 

縱觀pthread_cond_wait,它的理解不可之把它看作乙個簡單的wait函式,它裡面應該是一族函式,不同的函式在不同的條件下執行,理解pthread_cond_wait的機制可以很好的學習條件變數。 

參考

條件變數pthread cond t

unix環境高階程式設計 多執行緒同步,看到他舉例說條件變數pthread cond t怎麼用,愣是沒有看懂,只好在網上找了份 跑了跑,才弄明白.1.include include include pthread mutex t mutex pthread mutex initializer 初始化...

條件變數pthread cond t

最近看 unix環境高階程式設計 on裝置多執行緒程式 同步,看到他舉例說條件變數pthread cond t怎麼用,愣是沒有看懂,只好在網上找了份 跑了跑,才弄明白 cpp view plain copy include include include pthread mutex t mutex ...

執行緒條件變數pthread cond t

include int pthread cond init pthread cond t cv,const pthread condattr t cattr 返回值 函式成功返回0 任何其他返回值都表示錯誤初始化乙個條件變數。當引數cattr為空指標時,函式建立的是乙個預設的條件變數。否則條件變數的...