Linux 執行緒 五 (條件變數)

2021-08-22 04:34:59 字數 1294 閱讀 4314

我們先看一下條件變數的api:

條件變數: 

1.定義條件變數:pthread_cond_t cond;

2.初始化:pthread_cond_init(&cond,null)

3.等待條件 pthread_cond_wait(&cond,&mutex)

(1)mutex:如果沒有在互斥環境,形同虛設

(2)如果在,wait函式將mutex置成1,wait返回後,將mutex恢復成原來值

4.修改條件 pthread_cond_signal(&cond)

5.銷毀條件變數 pthread_cond_destroy(&cond)

我們可以看到等待條件變數的函式中有互斥量:

等待條件

pthread_cond_wait(&cond,&mutex)

(1)mutex:如果沒有在互斥環境,形同虛設

(2)如果在,wait函式將mutex置成1,wait返回後,將mutex恢復成原來值

為什麼會有互斥量呢?

條件變數的條件滿足肯定牽扯到共享資料的修改,所以一定要加互斥鎖來保護。沒有互斥鎖就無法安全的獲取和修改共享資料。

設計模型應該如下:

pthread_mutex_lock()

while(條件不滿足)

//while是因為pthread_cond_wait可能是因為被訊號打斷而喚醒

pthread_cond_wait()

pthread_mutex_unlock()

pthread_mutex_lock()

pthread_cond_signal()

//如果沒有執行緒等待,訊號被丟掉

pthread_mutex_unlock()

例子:

#include

#include

#include

#include

#include

pthread_cond_t cond;

pthread_mutex_t mutex;

void *rout1(void *arg)

}void *rout2(void *arg)

}int main()

執行結果:

只有通過其他執行緒改變了條件,並發出了訊號。在等待的執行緒條件滿足,才能繼續執行。

Linux執行緒同步 4 條件變數

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

Linux 執行緒同步3 條件變數

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

linux執行緒同步 2 條件變數

一.概述 條件變數總是和互斥量一起使用,互斥量保護著條件變數,防止多個執行緒對條件變數產生競爭。等會寫個小例子,看它們如何一起合作!二.函式介面 1.初始化條件變數 1.1 巨集常量初始化 1 pthread cond t cond pthread cond initializer 1.2 函式初始...