編譯:
[x61@horizon threads]$ gcc thread_cond.c -lpthread -o tcd
以下是程式執行結果:
[x61@horizon threads]$ ./tcd
thread1: lock 30
thread1: unlock 40
thread2: lock 52
thread2: wait 1 55
thread1: lock 30
thread1: unlock 40
thread1: lock 30
thread1:signal 1 33
thread1:signal 2 35
thread1: unlock 40
thread2: wait 2 57
thread2: unlock 61
thread1: lock 30
thread1: unlock 40
thread2: lock 52
thread2: wait 1 55
thread1: lock 30
thread1: unlock 40
thread1: lock 30
thread1:signal 1 33
thread1:signal 2 35
thread1: unlock 40
thread2: wait 2 57
thread2: unlock 61
這裡的兩個關鍵函式就在pthread_cond_wait和pthread_cond_signal函式。
本例中:
執行緒一先執行,獲得mutex鎖,列印,然後釋放mutex鎖,然後阻塞自己1秒。
執行緒二此時和執行緒一應該是併發的執行,這裡是乙個要點,為什麼說是執行緒此時是併發的執行,因為此時不做任何干涉的話,是沒有辦法確定是執行緒一先獲得執行還是執行緒二先獲得執行,到底那個執行緒先獲得執行,取決於作業系統的排程,想刻意的讓執行緒2先執行,可以讓執行緒2一出來,先sleep一秒。
這裡併發執行的情況是,執行緒一先進入迴圈,然後獲得鎖,此時估計執行緒二執行,阻塞在
pthread_mutex_lock(&mutex);
這行語句中,直到執行緒1釋放mutex鎖
pthread_mutex_unlock(&mutex);/*解鎖互斥量*/
然後執行緒二得已執行,獲取metux鎖,滿足if條件,到pthread_cond_wait(&cond,&mutex);/*等待*/
這裡的執行緒二阻塞,不僅僅是等待cond變數發生改變,同時釋放mutex鎖,因為當時看書沒有注意,所以這裡卡了很久。
mutex鎖釋放後,執行緒1終於獲得了mutex鎖,得已繼續執行,當執行緒1的if(i%3==0)的條件滿足後,通過pthread_cond_signal傳送訊號,告訴等待cond的變數的執行緒(這個情景中是執行緒二),cond條件變數已經發生了改變。
不過此時執行緒二並沒有立即得到執行,因為執行緒二還在等待mutex鎖的釋放,所以執行緒一繼續往下走,直到執行緒一釋放mutex鎖,執行緒二才能停止等待,列印語句,然後往下走通過pthread_mutex_unlock(&mutex)釋放mutex鎖,進入下乙個迴圈。
POSIX執行緒 條件變數
條件變數是 posix 執行緒結構,可以讓您在遇到某些條件時 喚醒 執行緒。可以將它們看作是一種執行緒安全的訊號傳送。如果執行緒正在等待某個特定條件發生,它應該如何處理這種情況?它可以重複對互斥物件鎖定和解鎖,每次都會檢查共享資料結構,以查詢某個值。但這是在浪費時間和資源,而且這種繁忙查詢的效率非常...
pthread cond 執行緒條件變數
條件變數 pthread cond,另外一種執行緒間的同步機制。普通的 mutex 只允許乙個執行緒進入臨界區,就是拿到mutex這把鎖的執行緒,而cond 允許多個執行緒同時進入臨界區,由它來控制,在某些條件成立的時候,來喚醒其中乙個等待著的執行緒,或者是喚醒所有等待著的執行緒。int pthre...
執行緒同步 條件變數
當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...