條件變數的工作原理
執行緒同步的生產者消費者模型其實是存在漏洞的,比如當倉庫滿的時候,生產者此時應該停止生產,同樣的,當倉庫為0的時候,消費者也應該是待消費狀態。
緩衝區為0,消費者必須等待,緩衝區滿,生產者必須等待。
當緩衝區為0,生產者生產了乙個產品,此時要喚醒在等待的消費者。同理,當緩衝區滿,消費者消費一件商品,生產者此時應該被喚醒。
作業系統提供的c語言api
條件變數配合互斥量使用
定義pthread_cond_t
等待條件滿足pthread_cond_wait
等待被喚醒pthread_cond_signal
#include
#include
#include
#include
#include
#include
#include
int max_buf =20;
int num =0;
pthread_cond_t cond = pthread_cond_initializer;
pthread_mutex_t mutex = pthread_mutex_initializer;
void
*producer
(void*)
num +=1
;printf
("生產乙個產品,當前產品數量為:%d\n"
, num)
;sleep(1
);// 生產產品需要的時間
pthread_cond_signal
(&cond)
;printf
("通知消費者...\n");
pthread_mutex_unlock
(&mutex)
;sleep(1
);// 生產產品的頻率}}
void
*consumer
(void*)
num -=1
;printf
("消費乙個產品,當前產品數量為:%d\n"
, num)
;sleep(1
);pthread_cond_signal
(&cond)
;printf
("通知生產者...\n");
pthread_mutex_unlock
(&mutex);}
}int
main()
執行結果是乙個不斷執行的程序,輪流列印倉庫數量
緩衝區空了, 等待生產者生產...
生產乙個產品,當前產品數量為:1
通知消費者...
消費乙個產品,當前產品數量為:0
通知生產者...
緩衝區空了, 等待生產者生產...
生產乙個產品,當前產品數量為:1
通知消費者...
消費乙個產品,當前產品數量為:0
通知生產者...
緩衝區空了, 等待生產者生產...
生產乙個產品,當前產品數量為:1
通知消費者...
消費乙個產品,當前產品數量為:0
通知生產者...
...................
通過上述**的通知與等待嚴格意義上實現了乙個生產者與消費者模型。 執行緒同步 條件變數
當我們需要控制對記憶體資源的訪問的時候,可以用一種簡單的加鎖的方法來控制,即互斥鎖。但互斥鎖有乙個明顯的缺點,就是它只有兩個狀態 鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補來互斥鎖的不足。條件變數通常和互斥鎖一起使用。使用過程 1.呼叫pthread mutex ...
執行緒同步 條件變數
1.問題引入 互斥鎖問題,假設現在有兩個資源a和b,乙個執行緒先拿a再拿b,另乙個則相反,這樣導致的問題就是死鎖,即兩個執行緒無休止的互相等待 include include include include pthread mutex t g mtxa pthread mutex initializ...
執行緒同步 條件變數
多執行緒中條件變數的使用 執行緒同步之條件變數 include include include include include include include include using namespace std 乙個簡單的緩衝區類 struct buffer bool full return f...