linux執行緒同步 2 條件變數

2021-08-13 10:39:52 字數 2773 閱讀 2239

一.概述

條件變數總是和互斥量一起使用,互斥量保護著條件變數,防止多個執行緒對條件變數產生競爭。等會寫個小例子,看它們如何一起合作!

二.函式介面

1.初始化條件變數

1.1:巨集常量初始化

1 pthread_cond_t cond = pthread_cond_initializer;
1.2:函式初始化

1 #include 2

3int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

跟互斥量類似,cond是條件變數的結構指標,attr是條件變數屬性的結構指標。

2.等待和通知條件變數

1 #include 2

3int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const

struct timespec *restrict abstime);

4int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);56

int pthread_cond_broadcast(pthread_cond_t *cond);

7int pthread_cond_signal(pthread_cond_t *cond);

等待函式裡面,要傳入乙個互斥量。pthread_cond_timewait()可以指定乙個時間來等待,如果規定的時間沒有獲得通知,就返回etimedout錯誤。而pthread_cond_wait()會一直阻塞。

通知函式,pthread_cond_signal()至少喚醒乙個等待的執行緒,pthread_cond_broadcast()會喚醒在該條件變數上所有執行緒。

3.銷毀條件變數

1 #include 2

3int pthread_cond_destroy(pthread_cond_t *cond);

三.簡單的例子

1/**

2* @file pthread_mutex.c3*/

45 #include 6 #include 7 #include

8 #include 9 #include 10

11/*

定義互斥量

*/12

pthread_mutex_t mtx;

13/*

互斥量屬性

*/14

pthread_mutexattr_t mtx_attr;

15/*

全域性資源

*/16

intmoney;

1718

/*條件變數

*/19 pthread_cond_t cond =pthread_cond_initializer;

2021

void err_exit(const

char *err_msg)

2226

27/*

執行緒函式

*/28

void *thread_fun(void *arg)

2941

42 printf("

子執行緒進入臨界區檢視money\n");

43if (money == 0)44

4849

/*解鎖

*/50 pthread_mutex_unlock(&mtx);

5152 sleep(1

);53}54

55return

null;56}

5758

int main(void)59

8990

/*解鎖

*/91 pthread_mutex_unlock(&mtx);

9293

/*如果money = 1,就通知子執行緒

可以看到第39行的等待條件變數觸發後,子執行緒會一直等待,直到主線程通知它。這樣子執行緒就不會頻繁進入臨界區,頻繁加鎖解鎖。

四.深入知識

1.等待函式裡面要傳入乙個互斥量,這個互斥量會在這個函式呼叫時會發生如下變化:函式剛剛被呼叫時,會把這個互斥量解鎖,然後讓呼叫執行緒阻塞,解鎖後其他執行緒才有機會獲得這個鎖。當某個執行緒呼叫通知函式時,這個函式收到通知後,又把互斥量加鎖,然後繼續向下操作臨界區。可見這個設計是非常合理的!!!

2.條件變數的等待函式用while迴圈包圍,本程式的第36行。原因:如果有多個執行緒都在等待這個條件變數關聯的互斥量,當條件變數收到通知,它下一步就是要鎖住這個互斥量,但在這個極小的時間差裡面,其他執行緒搶先獲取了這互斥量並進入臨界區把某個狀態改變了。此時這個條件變數應該繼續判斷別人剛剛搶先修改的狀態,即繼續執行while的判斷。還有乙個原因時防止虛假通知,收到虛假通知後,只要while裡面的條件為真,就繼續休眠!!!

執行緒同步(2)條件變數

互斥鎖有乙個明顯的缺點就是只有兩種狀態 鎖定和非鎖定,而條件變數通過允許執行緒阻塞和等待另個執行緒傳送訊號的方法來彌補互斥鎖的不足。條件變數通常和互斥鎖一起使用。條件變數的結構為pthread cond t 涉及函式 pthread cond init pthread cond detroy pth...

Linux執行緒同步 4 條件變數

分類 應用程式設計 2007 08 22 19 39 3812人閱讀收藏 舉報條件變數分為兩部分 條件和變數.條件本身是由互斥量保護的.執行緒在改變條件狀態前先要鎖住互斥量.1.初始化 條件變數採用的資料型別是pthread cond t,在使用之前必須要進行初始化,這包括兩種方式 pthread....

Linux 執行緒同步3 條件變數

條件變數是執行緒同步的另一種同步機制。執行緒在改變條件狀態前必須首先鎖住互斥量,其他執行緒在獲得互斥量之前不會察覺到這種改變,因為必須鎖定互斥量以後才能計算條件。條件變數使用之前必須首先進行初始化,pthread cond t資料型別代表的條件變數可以用兩種方式進行初始化。對於靜態分配的條件變數可以...