條件變數pthread cond t

2021-08-18 09:46:04 字數 3055 閱讀 3245

最近看《unix環境高階程式設計》on裝置多執行緒程式**同步,看到他舉例說條件變數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);}}

[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

*);  

inti=1;  

intmain(

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鎖,進入下乙個迴圈。

條件變數 pthread cond

posted on august 4,2013 早起翻apue,查缺補漏。書接上回,看到 條件變數 七八年前看過,有點模糊的印象。不過還是有些地方解釋不過去,看來我當年也只是 看了 但是 沒理解 根據後面的示例 enqueue msg 和process msg 因為都呼叫pthread mutex ...

pthread cond 執行緒條件變數

條件變數 pthread cond,另外一種執行緒間的同步機制。普通的 mutex 只允許乙個執行緒進入臨界區,就是拿到mutex這把鎖的執行緒,而cond 允許多個執行緒同時進入臨界區,由它來控制,在某些條件成立的時候,來喚醒其中乙個等待著的執行緒,或者是喚醒所有等待著的執行緒。int pthre...

條件變數 pthread cond init

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