我們先看一下條件變數的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 函式初始...