條件變數 多執行緒

2021-06-28 03:52:40 字數 2400 閱讀 9777

最近看《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...