使用訊號量實現生產者 消費者問題

2021-09-29 12:25:59 字數 751 閱讀 8676

問題描述:使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品;只有緩衝區不為空,消費者才可以拿走物品。

因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 mutex 來控制對緩衝區的互斥訪問。

為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以使用訊號量來進行統計,這裡需要使用兩個訊號量:empty 記錄空緩衝區的數量,full 記錄滿緩衝區的數量。其中,empty 訊號量是在生產者程序中使用,當 empty 不為 0 時,生產者才可以放入物品;full 訊號量是在消費者程序中使用,當 full 訊號量不為 0 時,消費者才可以取走物品。

注意,不能先對緩衝區進行加鎖,再測試訊號量。也就是說,不能先執行 down(mutex) 再執行 down(empty)。如果這麼做了,那麼可能會出現這種情況:生產者對緩衝區加鎖後,執行 down(empty) 操作,發現 empty = 0,此時生產者睡眠。消費者不能進入臨界區,因為生產者對緩衝區加鎖了,消費者就無法執行 up(empty) 操作,empty 永遠都為 0,導致生產者永遠等待下,不會釋放鎖,消費者因此也會永遠等待下去。

#define n 100

typedef int semaphore;

semaphore mutex = 1;

semaphore empty = n;

semaphore full = 0;

void producer()

}void consumer()

}

消費者 生產者問題 程序的實現訊號量

生產者 消費者問題是作業系統的經典問題,需求是這樣的 在系統中建立乙個共享記憶體區域,記憶體區有長度為1的浮點陣列,兩個程序分別對共享記憶體區進行操作,程序a複雜迴圈向共享記憶體區域寫入資料,b複雜讀取由程序a產生的資料。為了更好的利用訊號量,觀察效果,a和b程序沒有親緣關係。如下 程序a,負責傳送...

Linux系統訊號量實現生產者 消費者問題

include include include include using namespace std const int buffer size 1024 const int wait time 10 sem t empty sem t full pthread mutex t mtx pthre...

C使用訊號量實現生產者消費者模型

一 概述 案例 編寫乙個案例 使用訊號量 sem t 來實現生產者消費者模型。訊號量 相當於多把鎖,可以理解為加強版的互斥鎖,其在一定程度上可以提高併發的效率 相關函式 定義訊號量 sem t sem int sem init sem t sem,int pshared,unsigned int v...