m個消費者,r個消費者和n個緩衝器
分析:現在是m個生產者在生產了產品向緩衝器存放時,由於只有乙個指示位置的共享變數k,所以那些所有的生產者需要互斥訪問共享變數k,即同一時刻只能有乙個訪問,同理消費者共享了指示位置的t,所有消費者也要互斥訪問共享變數t,顯然生產者需要乙個乙個的去緩衝器中存放物品,而消費者需要乙個乙個的到緩衝器中存放物品,但現在有兩種解法的點在於:是可以生產者和消費者只能有乙個在緩衝器中,還是即使生產者在緩衝器中,消費者也可以進來取東西。
現在我們先來說第乙個程式(生產者和消費者同一時刻只能有乙個在緩衝器中)
首先我們還要以前講過的sp = n(用於計數可用資源數(空的緩衝器)),sc = 0(用於記錄滿的緩衝器)兩個訊號互斥量,還需要增加乙個互斥訊號量s = 1(用於生產者和消費者之間互斥訪問緩衝器)
[html]view plain
copy
int buffer[n],k=
0,t=
0;
semaphore sp= n
,sc= 0
, s= 1
; process produceri(void) (i= 1
,2,3...m)
; p(sp);
p(s);
buffer[k] = product;
k= (++k)%n;
v(s);
v(sc);
} }
[html]view plain
copy
process consumerj(void) (j=
1,2,3....r)
; t
= (++t)%n;
v(sp);
v(s);
; }
}
(2)就是上面所說的在生產者在緩衝器裡面房放產品時,消費者也能進去取產品。
其實修改很簡單,上面程式不是設定乙個訊號量讓s = 1,不管是消費者還是生產者都只能乙個人訪問共享變數,現在只要在生產者裡面設立乙個互斥訪問量s1 = 1,然後在消費者裡面在設立乙個互斥訪問量s2 = 1,就行了。
作業系統,生產者 消費者問題詳解
生產者 消費者問題 分析問題,確定臨界區 設定互斥訊號量,初值為1 臨界區之前對訊號量執行p操作臨界區之後對訊號量執行v操作分析問題,找出 需要實現 一前一後 的同步關係 設定同步訊號量,初始值為0 在 前操作 之後執行v操作在 後操作 之前執行p操作分析問題,畫出前驅圖,把每一對前驅關係都看成乙個...
作業系統裡的生產者 消費者問題
前段時間網上有乙個人讓我幫他改個程式,作業系統裡面生產者與消費者的那個程式,寫的一片混亂,改了好長時間。很弱智。include include include include include using namespace std define buffer num 6 int product bu...
生產者和消費者問題c 作業系統)
生產者和消費者 include include include includeusing namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short ...