²Ù×÷ϵͳ½Ì³Ì - ËïÖÓÐ㣨µÚËİ棩¿ÎºóϰÌâ´ð°¸ ÏÂÔØ±¾ÎÄ

P ( seatcount ) ; P £¨mutex ) ;

for i : = 1 to 100 do i++

if A [ i ].name£½null then A [ i ].name£ºreadername£» reader get the seat number=i£»/*A[I].number V ( mutex )

½øÈëÔÄÀÀÊÒ£¬×ùλºÅi £¬×ù϶ÁÊ飻 P ( mutex ) ; A[i]name£ºnull ; V £¨mutex ) ; V(seatcount); À뿪ÔÄÀÀÊÒ£» } } coend

2 £©Ê¹Óù̲ܳÙ×÷£º TYPE readbook=monitor VAR R: condition ; I,seatcount £ºinteger;

name£ºarray [ l:100] of string ; DEFINE rcadercome, readerleave ;

USE check , wait , signal , release ; Procedure readercome ( readername ) begin

check ( IM ) ;

if seatcount¡Ý100 wait ( R,IM ) seatcount : = seatcount + 1 ; for i=1 to 100 do i++

if name[i] ==null then name[i]:= readername; get the seat number = i ; release ( IM ) ; end

procedure readerleave ( readername ) begin

check ( IM ) ; seatcount--;

for i = 1 to 1 00 do i++

if name£Ûi £Ýreadername then name£Ûi£Ý:null; release ( IM ) ; end begin

seatcount : = 1OO ; name:£½null ; end

cobegin

{

process readeri ( i = 1 , 2 £®? £© begin

readercome ( readername£©; read the book ;

readerleave ( readername£©; leave the readroom; end }

coend.

5. ÔÚÒ»¸öºÐ×ÓÀ»ì×°ÁËÊýÁ¿ÏàµÈµÄºÚ°×ΧÆå×Ó¡¤ ÏÖÔÚÓÃ×Ô¶¯·Ö¼ðϵͳ°ÑºÚ×Ó¡¢°××Ó·Ö¿ª£¬Éè·Ö¼ðϵͳÓжþ¸ö½ø³ÌP1 ºÍP2 £¬ÆäÖÐP1 ¼ð°××Ó£»P2 ¼ðºÚ×Ó¡£¹æ¶¨Ã¿¸ö½ø³Ìÿ´Î¼ðÒ»×Ó£»µ±Ò»¸ö½ø³ÌÔÚ¼ðʱ£¬²»ÔÊÐíÁíÒ»¸ö½ø³ÌÈ¥¼ð£»µ±Ò»¸ö½ø³Ì¼ðÁËÒ»×Óʱ£¬±ØÐëÈÃÁíÒ»¸ö½ø³ÌÈ¥¼ð£®ÊÔд³öÁ½½ø³ÌP1 ºÍP2 Äܲ¢·¢ÕýÈ·Ö´ÐеijÌÐò¡£

´ð1 £ºÊµÖÊÉÏÊÇÁ½¸ö½ø³ÌµÄͬ²½ÎÊÌ⣬ÉèÐźÅÁ¿s1 ºÍs2 ·Ö±ð±íʾ¿É¼ð°××ӺͺÚ×Ó£¬²»Ê§Ò»°ãÐÔ£¬ÈôÁîÏȼð°××Ó¡£ var S1 , S2 : semaphore; S1 : = l; S2 £º=0; cobegin {

process P1 begin repeat P( S1 ) ; ¼ð°××Ó

V ( S2 ) ; until false ; end

process P2 begin repeat P ( S2 ) ; ¼ðºÚ×Ó

V (S1 ) ;

until false ; end }

coend . ´ð2 :

TYPE pickup-chess = MONITOR VAR flag : boolean ;

S-black , s-white : codition ;

DEFINE pickup-black , pickup-white ;

USE wait,signal , check , release ; procedure pickup-black ; begin

check(IM ) ;

if flag then wait(s-black,IM ) ; flag : £½true; pickup a black;

signal(S-white,IM); release ( IM ) ; end

procedure pickup-white ; begin

check ( IM ) ;

if not flag then wait(S-white,IM ); flag :=false ; pickup a white ;

signal ( S-black,IM ) ; release ( IM ) ; end begin

flag:=true ; end

main ( ) { cobegin

process -B ( ) ; process -W ( ) ; coend }

process-B ( ) begin

pickup-chess.pickup-black ( ) ; other ; end

process-W ( ) begin

pickup-chess.pickup-white( ) ; other ; end

6 ¹Ü³ÌµÄͬ²½»úÖÆÊ¹ÓÃÌõ¼þ±äÁ¿ºÍwait ¼°signal £¬³¢ÊÔΪ¹Ü³ÌÉè¼ÆÒ»ÖÖ½ö½öʹÓÃÒ»¸öÔ­Óï²Ù×÷µÄͬ²½»úÖÆ¡£

´ð£º¿ÉÒÔ²ÉÓÃÐÎÈçwaituntil £¼Ìõ¼þ±í´ïʽ£¾µÄͬ²½Ô­Óï¡£Èçwaituntil ( numbersum + number < K ) ±íʾ½ø³ÌÓÉÓÚÌõ¼þ²»Âú×ã¶øÓ¦µÈ´ý£¬µ±½ø³ÌºÅÀÛ¼ÓºÍСÓÚK ʱ£¬ÏµÍ³Ó¦»½ÐѸýø³Ì¹¤×÷£®

7 É蹫¹²Æû³µÉÏ£¬Ë¾»úºÍÊÛÆ±Ô±µÄ»î¶¯·Ö±ðÈçÏ£º ˾»úµÄ»î¶¯£ºÆô¶¯³µÁ¾£ºÕý³£Ðгµ£»µ½Õ¾Í£³µ¡£ ÊÛÆ±Ô±µÄ»î¶¯£º¹Ø³µÃÅ£»ÊÛÆ±£»¿ª³µÃÅ¡£

ÔÚÆû³µ²»¶ÏµØµ½Õ¾¡¢Í£³µ¡¢ÐÐÊ»¹ý³ÌÖУ¬ÕâÁ½¸ö»î¶¯ÓÐʲôͬ²½¹ØÏµ£¿ÓÃÐźÅÁ¿ºÍP ¡¢V ²Ù×÷ʵÏÖËüÃǵÄͬ²½¡£

´ð£ºÔÚÆû³µÐÐÊ»¹ý³ÌÖУ¬Ë¾»ú»î¶¯ÓëÊÛÆ±Ô±»î¶¯Ö®¼äµÄͬ²½¹ØÏµÎª£ºÊÛÆ±Ô±¹Ø³µÃźó£¬Ïò˾»ú·¢¿ª³µÐźţ¬Ë¾»ú½Óµ½¿ª³µÐźźóÆô¶¯³µÁ¾£¬ÔÚÆû³µÕý³£ÐÐÊ»¹ý³ÌÖÐÊÛÆ±Ô±ÊÛÆ±£¬µ½Õ¾Ê±Ë¾»úÍ£³µ£¬ÊÛÆ±Ô±ÔÚ³µÍ£ºó¿ªÃÅÈó˿ÍÉÏϳµ¡£Òò´Ë£¬Ë¾»úÆô¶¯³µÁ¾µÄ¶¯×÷±ØÐëÓëÊÛÆ±Ô±¹Ø³µÃŵ͝×÷È¡µÃͬ²½£»ÊÛÆ±Ô±¿ª³µÃŵ͝×÷Ò²±ØÐëÓë˾»úÍ£³µÈ¡µÃͬ²½¡£Ó¦ÉèÖÃÁ½¸öÐźÅÁ¿£ºS1 ¡¢S2 ;S1 ±íʾÊÇ·ñÔÊÐí˾»úÆô¶¯Æû³µ£¨Æä³õֵΪ0 ) ;S2 ±íʾÊÇ·ñÔÊÐíÊÛÆ±Ô±¿ªÃÅ£¨Æä³õֵΪ0 £©¡£ÓÃP ¡¢v Ô­ÓïÃèÊöÈçÏ£º

var S1 , S2 : semaphore ; S1=0£»S2=0£» cobegin {

driver ( ) ; busman ( ) ; } coend

driver ( ) begin

while ( 1 ) { P ( S1 )

Æô¶¯³µÁ¾£»Õý³£Ðгµ£»µ½Õ¾Í£³µ£» V ( S2 ) ; } end

busman ( ) begin

while ( 1 ) { ¹Ø³µÃÅ£» V ( 51 ) ÊÛÆ±;

P ( S2 ) ¿ª³µÃÅ£» ÉÏϳ˿ͣ» } end

8¡¢Ò»¸ö¿ì²ÍÌüÓÐ4 ÀàÖ°Ô±£º( l £©Áì°à£º½ÓÊܹ˿͵ã²Ë£»( 2 £©³øÊ¦£º×¼±¸¹Ë¿ÍµÄ·¹²Ë£»( 3 ) °ü¹¤£º½«×öºÃµÄ·¹²Ë´ò°ü£»( 4 £©³öÄÉÔ±£ºÊÕ¿î²¢ÌύʳƷ¡£Ã¿¸öÖ°Ô±¿É±»¿´×÷Ò»¸ö½ø³Ì£¬ÊÔÓÃÒ»ÖÖͬ²½»úÖÆÐ´³öÄÜÈÃËÄÀàÖ°Ô±ÕýÈ·²¢·¢ÔËÐеijÌÐò¡£

´ð£ºµäÐ͵Ľø³Ìͬ²½ÎÊÌ⣬¿ÉÉèËĸöÐźÅÁ¿51 ¡¢S2 ¡¢S3 ºÍS4 À´Ð­µ÷½ø³Ì¹¤