最近看《unix環境高階程式設計》多執行緒同步,看到他舉例說條件變數pthread_cond_t怎麼用,愣是沒有看懂,只好在網上找了份**,跑了跑,才弄明白
[cpp]view plain
copy
#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)
pthread_mutex_unlock(&mutex);/*解鎖互斥量*/
printf("thread1: unlock %d/n/n", __line__);
sleep(1);
} }
void *thread2(void *junk)
pthread_mutex_unlock(&mutex);
printf("thread2: unlock %d/n/n", __line__);
sleep(1);
} }
編譯:[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鎖,進入下乙個迴圈。
多執行緒的條件變數
條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。1 建立和登出 條件變數和互斥鎖一樣,都有靜態動態兩種建立方式,靜態方式使用pt...
多執行緒程式設計 條件變數
條件變數 條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條件成立 而掛起 另乙個執行緒使 條件成立 給出條件成立訊號 為了防止競爭,條件變數的使用總是和乙個互斥鎖結合在一起。1.建立和登出 條件變數和互斥鎖一樣,都有靜態和動態兩種建立方式,靜態...
APUE多執行緒 條件變數
關於條件變數相關的定義和函式參考下面第一篇部落格,比較直觀的程式例子參看第二篇部落格.二位老人家寫的不錯,我這裡只是捋一下apue書中關於條件變數的 include struct msg struct msg workg pthread cont t qready pthread cond init...