最近看《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為空指標時,函式建立的是乙個預設的條件變數。否則條件變數的...