P(mutex ) ;
numbersum: = numbersum-number ; V(waits ) ; V(mutex ) ; 2 £©Ê¹Óụ̀ܳº
TYPE sharefile = MONITOR VAR numbersum ,n : integer ; SF : codition ;
DEFINE startread , endread ;
USE wait , signal , check , release ;
procedure startread ( var number £ºinteger : ) ; begin
check (IM ) ;
L :if£¨number + numbersum )¡Ý K then {wait(SF,IM) ; goto L ; } Numbersum:=numbersum+number; release (IM ) ; end
procedure endread (var number:integer ; ) ; begin
check(IM ) ;
numbersum : = numbersum - number ; signal ( SF , IM ) ; release ( IM ) ; end begin
numbersum:=0 end . main()
{ cobegin
process-i() ; coend }
process-i()
var number : integer ; begin
number : £½½ø³Ì¶ÁÎļþ±àºÅ£» startread(number);; read F ;
endread(number) ; end
26¡¢É赱ǰµÄϵͳ״̬ÈçÏ£ºÏµÍ³´ËʱAvailable=(1,1,2):
l £©¼ÆËã¸÷¸ö½ø³Ì»¹ÐèÒªµÄ×ÊÔ´ÊýCki - Aki ( 2 £©ÏµÍ³ÊÇ·ñ´¦ÓÚ°²È«×´Ì¬£¬ÎªÊ²Ã´£¿
( 3 ) P2 ·¢³öÇëÇóÏòÁ¿request2 ( 1 , o , 1 ) £¬ÏµÍ³ÄܰÑ×ÊÔ´·Ö¸øËüÂ𣿠( 4 £©ÈôÔÚP2 ÉêÇë×ÊÔ´ºó£¬ÈôP1 ·¢³öÇëÇóÏòÁ¿req ¹»stl ( 1 ,0, l ) £¬ÏµÍ³ÄܰÑ×ÊÔ´·Ö¸øËüÂð£¿
( 5 £©ÈôÔÚP1 ÉêÇë×ÊÔ´ºó£¬ÈôP3 ·¢³öÇëÇóÏòÁ¿request3 ( 0 ,0£¬l ) £¬ÏµÍ³ÄܰÑ×ÊÔ´·Ö¸øËüÂð£¿
´ð£º( 1 ) P1 , P2 , P3 , P4 µÄCki . Aki ·Ö±ðΪ£º( 2 , 2 , 2 £©¡¢£¨1 , 0 , 2 £©¡¢£¨1 , 0 , 3 £©¡¢£¨4 , 2 , 0 ) ( 4 £©ÏµÍ³´¦ÓÚ°²È«×´Ì¬£¬´æÔÚ°²È«Ðò£ºP2 , P1 , P3 , P4
( 5 £©¿ÉÒÔ·ÖÅ䣬´æÔÚ°²È«ÐòÁУºP2 , P1 , P3 , P4 . ( 6 £©²»¿ÉÒÔ·ÖÅ䣬×ÊÔ´²»×ã¡£ ( 7 £©²»¿ÉÒÔ·ÖÅ䣬²»°²È«×´Ì¬¡£
27 ϵͳÓÐA ¡¢B ¡¢C ¡¢D ¹²4 ÖÖ×ÊÔ´£¬ÔÚijʱ¿Ì½ø³ÌPO ¡¢Pl ¡¢PZ ¡¢P3 ºÍP4 ¶Ô×ÊÔ´µÄÕ¼ÓкÍÐèÇóÇé¿öÈç±í£¬ÊÔ½â´ðÏÂÁÐÎÊÌ⣺
ϵͳ´Ëʱ´¦ÓÚ°²È«×´Ì¬Âð£¿
Èô´ËʱP2 ·¢³örequest2 ( 1 ¡¢2 ¡¢2 ¡¢2 ) £¬ÏµÍ³ÄÜ·ÖÅä×ÊÔ´¸øËüÂð£¿ÎªÊ²Ã´£¿
´ð£º( l £©ÏµÍ³´¦ÓÚ°²È«×´Ì¬£¬´æÔÚ°²È«ÐòÁУºP0, P3 , P4 , P1 , P2 ¡£ ( 2 £©²»ÄÜ·ÖÅ䣬·ñÔòϵͳ»á´¦ÓÚ²»°²È«×´Ì¬¡£ 28 °ÑËÀËø¼ì²âËã·¨ÓÃÓÚÏÂÃæµÄÊý¾Ý£¬²¢ÇëÎÊ£º Available=(1,0,2,0)