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 À´Ðµ÷½ø³Ì¹¤