裝水問題(引入普通變數)
阿新 • • 發佈:2018-12-21
///****似乎解法是一個工人,而不是兩個工人,需要改進****//////
問題描述:
兩個搬運工人向卡車中裝純淨水,每車最多20箱。卡車裝滿即開走,需裝10輛車。給出簡單的同步分析及演算法,寫明訊號量的含義和初值
提示:訊號量和普通變數結合使用
解答 :
設定變數
/***車(互斥)***/
①semaphore m=1
/***工人裝滿20箱水->車就離開(同步)***/
②semaphore go=0
/***記錄車裝水20次,實現車需要裝水->工人裝水(同步),用for迴圈控制裝20次***/
【3】semaphore empty=0
/***設定一個整形變數count,用於判斷工人是否裝水20次用來響應車離開***/
【4】int count=0
che(){ |
/***車互斥***/ wait(m); |
進入裝水位; |
For(i=1;i<=20;i++) //用for控制20次裝水(同步或稱為順序進行) |
signal(empty); //釋放20次empty,即work()需要執行20次裝水才允許釋放go【work()內釋放go】 |
wait(go); //同步順序進行,當工人裝滿20次時釋放go,此時車才能離開 |
離開; |
signal(m); } |
void main(){ for(i=1;i<=20;i++) che(); work(); } |
work(){ |
while(TRUE){ |
wait(empty); |
count++; 【empty變數的設定就是為了使count變數加到20用來if語句判斷,從而釋放go變數來讓che()知道已經裝滿20次水車可以離開】 |
if(count==20) |
{signal(go); 【釋放go,che()可以離開了】 |
count=0; 【count清零,用於下一次判斷】 } } |