問題描述
假設(shè)一個(gè)系統(tǒng)有三個(gè)抽煙者進(jìn)程和一個(gè)供應(yīng)者進(jìn)程。每個(gè)抽煙者需要有三種材料:煙草、紙和膠水,才可吸煙。三個(gè)抽煙者分別擁有三種材料中的一種。 供應(yīng)者每次隨機(jī)將兩種材料放到桌子上,擁有剩下那種材料的抽煙者卷一根煙并抽掉它。材料被使用后,供應(yīng)者按上述原則繼續(xù)提供材料。
問題分析
關(guān)系分析。供應(yīng)者與三個(gè)抽煙者分別是同步關(guān)系。由于供應(yīng)者無法同時(shí)滿足兩個(gè)或 以上的抽煙者,三個(gè)抽煙者對(duì)抽煙這個(gè)動(dòng)作互斥。
整理思路。這里有四個(gè)進(jìn)程。供應(yīng)者作為生產(chǎn)者向三個(gè)抽煙者提供材料。
信號(hào)量設(shè)置。信號(hào)量offer1、offer2、offer3分別表示煙草和紙組合的資源、煙草和 膠水組合的資源、紙和膠水組合的資源。信號(hào)量finish用于互斥進(jìn)行抽煙動(dòng)作。
解決方案
注意:finish初始值為0,表示無人抽煙,當(dāng)供應(yīng)者材料抽煙后,材料使用完畢,會(huì)調(diào)用V(finish),將finish加1。供應(yīng)者接到此通知后,繼續(xù)隨機(jī)提供材料。代碼如下:
int random; //存儲(chǔ)隨機(jī)數(shù)
semaphore offer1=0; //定義信號(hào)量對(duì)應(yīng)煙草和紙組合的資源
semaphore offer2=0; //定義信號(hào)量對(duì)應(yīng)煙草和膠水組合的資源
semaphore offer3=0; //定義信號(hào)量對(duì)應(yīng)紙和膠水組合的資源
semaphore finish=0; //定義信號(hào)量表示抽煙是否完成
//供應(yīng)者
while(1){
random = 任意一個(gè)整數(shù)隨機(jī)數(shù);
random=random% 3;
if(random==0)
V(offerl) ; //提供煙草和紙
else if(random==l)
V(offer2); //提供煙草和膠水
else
V(offer3) //提供紙和膠水
// 任意兩種材料放在桌子上,并等待抽煙者抽煙后將finish設(shè)置為1
P(finish);//抽煙者已經(jīng)使用完材料,需要繼續(xù)提供材料
}
//擁有煙草者
while(1){
P (offer3);
// 拿紙和膠水,卷成煙,抽掉;
V(finish);
}
//擁有紙者
while(1){
P(offer2);
// 煙草和膠水,卷成煙,抽掉;
V(finish);
}
//擁有膠水者
while(1){
P(offer1);
// 拿煙草和紙,卷成煙,抽掉;
v(finish);
}