下面是乙個簡單的例子,我們可以從程式的執行來了解條件變數的作用。
#include
#include
#include
pthread_mutex_t mutex = pthread_mutex_initializer;/*
初始化互斥鎖
*/pthread_cond_t cond = pthread_cond_initializer;/*
初始化條件變數
*/void *thread1(void *);
void *thread2(void *);
int i=1;
int main(void)
void *thread1(void *junk)
}void *thread2(void *junk)
}程式建立了
2個新執行緒使他們同步執行,實現程序
t_b列印
20以內
3的倍數,
t_a列印其他的數,程式開始執行緒
t_b不滿足條件等待,執行緒
t_a執行使
a迴圈加
1並列印。直到i為
3的倍數時,執行緒
t_a傳送訊號通知程序
t_b,這時
t_b滿足條件,列印i值。
下面是執行結果:
#cc –lpthread –o cond cond.c
#./cond
thread1:1
thread1:2
thread2:3
thread1:4
thread1:5
thread2:6
thread1:7
thread1:8
thread2:9
備註:pthread_cond_wait 執行的流程首先將這個mutex解鎖, 然後等待條件變數被喚醒, 如果沒有被喚醒, 該執行緒將一直休眠, 也就是說, 該執行緒將一直阻塞在這個pthread_cond_wait呼叫中, 而當此執行緒被喚醒時, 將自動將這個mutex加鎖,然後再進行條件變數判斷(原因是「驚群效應」,如果是多個執行緒都在等待這個條件,而同時只能有乙個執行緒進行處理,此時就必須要再次條件判斷,以使只有乙個執行緒進入臨界區處理。),如果滿足,則執行緒繼續執行,最後解鎖,
也就是說pthread_cond_wait實際上可以看作是以下幾個動作的合體:
解鎖執行緒鎖
等待執行緒喚醒,並且條件為true
加鎖執行緒鎖.
pthread_cond_signal僅僅負責喚醒正在阻塞在同一條件變數上的乙個執行緒,如果存在多個執行緒,系統自動根據排程策略決定喚醒其中的乙個執行緒,在多處理器上,該函式是可能同時喚醒多個執行緒,同時該函式與鎖操作無關,解鎖是由pthread_mutex_unlock(&mutex)完成
喚醒丟失往往會在下面的情況下發生:
乙個執行緒呼叫pthread_cond_signal或pthread_cond_broadcast函式;
另乙個執行緒正處在測試條件變數和呼叫pthread_cond_wait函式之間;
沒有執行緒正在處在阻塞等待的狀態下。
linux 執行緒學習之條件變數
互斥鎖 用來上鎖。條件變數 用來等待,當條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。函式介紹 1 名稱 pthread cond init 目標 條件變數初始化 標頭檔案 include pthread.h 函式原形 int pthread cond ini...
linux 執行緒學習之條件變數
互斥鎖 用來上鎖。條件變數 用來等待,當條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。函式介紹 1 名稱 pthread cond init 目標 條件變數初始化 標頭檔案 include pthread.h 函式原形 int pthread cond ini...
Linux執行緒同步之條件變數
與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙...