²Ù×÷ϵͳ´ð°¸

ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 2025/12/1 14:46:30ÐÇÆÚÒ» ÏÂÃæÊÇÎÄÕµÄÈ«²¿ÄÚÈÝÇëÈÏÕæÔĶÁ¡£

end

11

b.Varempty,full:semaphore:=1,0; gather: begin repeat ¡­¡­

gatherdatainnextp; wait(empty); buffer:=nextp; signal(full); untilfalse; end

compute: begin repeat ¡­¡­ wait(full); nextc:=buffer; signal(empty);

computedatainnextc; untilfalse;

end 29£®»­Í¼ËµÃ÷¹Ü³ÌÓÉÄ¿·Ö×é³É£¬ÎªÊ²Ã´ÒªÒýÈëÌõ¼þ±äÁ¿£¿

´ð£º¹Ü³ÌÓÉËIJ¿·Ö×é³É£º¢Ù¹Ü³ÌµÄÃû³Æ£»¢Ú¾Ö²¿ÓڹܳÌÄÚ²¿µÄ¹²ÏíÊý¾Ý½á¹¹ËµÃ÷£» ¢Û¶Ô¸ÃÊý¾Ý½á¹¹½øÐвÙ×÷µÄÒ»×é¹ý³Ì£»¢Ü¶Ô¾Ö²¿ÓڹܳÌÄÚ²¿µÄ¹²ÏíÊý¾ÝÉèÖóõʼֵµÄÓï¾ä£»

µ±Ò»¸ö½ø³Ìµ÷ÓÃÁ˹̣ܳ¬ÔڹܳÌÖÐʱ±»×èÈû»ò¹ÒÆð£¬Ö±µ½×èÈû»ò¹ÒÆðµÄÔ­Òò½â³ý£¬ ¶øÔÚ´ËÆÚ¼ä£¬Èç¹û¸Ã½ø³Ì²»ÊͷẒ́ܳ¬ÔòÆäËü½ø³ÌÎÞ·¨½øÈë¹Ü³Ì£¬±»ÆÈ³¤Ê±¼äµØµÈ´ý¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÒýÈëÁËÌõ¼þ±äÁ¿condition¡£ 30£®ÈçºÎÀûÓùܳÌÀ´½â¾öÉú²úÕßÓëÏû·ÑÕßÎÊÌ⣿

´ð£ºÊ×ÏȽ¨Á¢Ò»¸ö¹Ü³Ì£¬ÃüÃûΪProclucerConsumer£¬°üÀ¨Á½¸ö¹ý³Ì£º£¨1£©Put

10

£¨item£©¹ý³Ì¡£Éú²úÕßÀûÓøùý³Ì½«×Ô¼ºÉú²úµÄ²úÆ··Åµ½»º³å³Ø£¬ÓÃÕûÐͱä

Á¿ count ±íʾÔÚ»º³å³ØÖÐÒÑÓеIJúÆ·ÊýÄ¿£¬µ± count¡Ýn ʱ£¬±íʾ»º³å³ØÒÑÂú£¬ Éú²úÕßÐëµÈ´ý¡£2£©get£¨item£©¹ý³Ì¡£Ïû·ÑÕßÀûÓøùý³Ì´Ó»º³å³ØÖÐÈ¡³öÒ»¸ö²úÆ·£¬µ± count¡Ü0 ʱ£¬±íʾ»º³å³ØÖÐÒÑÎÞ¿ÉÈ¡µÄ²úÆ·£¬Ïû·ÑÕßÓ¦µÈ´ý¡£ PC ¹Ü³Ì¿ÉÃèÊöÈçÏ£º typeproducer-consumer=monitor Varin,out,count:integer; buffer:array[0,¡­,n-1]ofitem; notfull£¬notempty:condition; procedureentrydot(item) begin

ifcount>=nthennotfull.wait; buffer(in):=nextp; in:=(in+1)modn; count:=count+1;

ifnotempty.queuethennotempty.signal; end

procedureentryget(item) begin

ifcount<=0thennotfull.wait; nextc:=buffer(out); out:=(out+1)modn; count:=count-1;

ifnotfull.quenethennotfull.signal; end

beginin:=out:=0; count:=0 end

ÔÚÀûÓùܳ̽â¾öÉú²úÕßÒ»Ïû·ÑÕßÎÊÌâʱ£¬ÆäÖеÄÉú²úÕߺÍÏû·ÑÕß¿ÉÃèÊöΪ£º producer:begin pepeat

produceanineminnestp PC.put(item); untilfalse; end

consumer:begin repeat PC.get(item);

consumetheiteminenxtc; untilfalse; end

31£®Ê²Ã´ÊÇ AND ÐźÅÁ¿£¿ÊÔÀûÓà AND ÐźÅÁ¿Ð´³öÉú²úÕßÒ»Ïû·ÑÕßÎÊÌâµÄ½â·¨¡£

11

´ð£ºÎª½â¾ö²¢ÐдøÀ´µÄËÀËøÎÊÌ⣬ÔÚwait²Ù×÷ÖÐÒýÈëANDÌõ¼þ£¬Æä»ù±¾Ë¼ÏëÊǽ«½ø³ÌÔÚÕû¸öÔËÐйý³ÌÖÐËùÐèÒªµÄËùÓÐÁÙ½ç×ÊÔ´£¬Ò»´ÎÐÔµØÈ«²¿·ÖÅ䏸½ø³Ì£¬ÓÃ

12

ÍêºóÒ»´ÎÐÔÊÍ·Å¡£

½â¾öÉú²úÕߣ­Ïû·ÑÕßÎÊÌâ¿ÉÃèÊöÈçÏÂ: varmutex,empty,full:semaphore:=1,n,0; buffer:array[0,...,n-1]ofitem; in,out:integer:=0,0; begin parbegin

producer:begin repeat ¡­

produceaniteminnextp; ¡­ wait(empty);

wait(s1,s2,s3,...,sn);//s1,s2,...,snΪִÐÐÉú²úÕß½ø³Ì³ýemptyÍâÆäÓàµÄÌõ¼þ

wait(mutex); buffer(in):=nextp; in:=(in+1)modn; signal(mutex); signal(full); signal(s1,s2,s3,...,sn); untilfalse; end

consumer:begin repeat wait(full);

wait(k1,k2,k3,...,kn);//k1,k2,...,knΪִÐÐÏû·ÑÕß½ø³Ì³ýfullÍâÆäÓàµÄÌõ¼þ

wait(mutex); nextc:=buffer(out); out:=(out+1)modn; signal(mutex); signal(empty); signal(k1,k2,k3,...,kn); consumetheiteminnextc; untilfalse; end parend end

32£®Ê²Ã´ÊÇÐźÅÁ¿¼¯£¿ÊÔÀûÓÃÐźÅÁ¿¼¯Ð´³ö¶ÁÕßһдÕßÎÊÌâµÄ½â·¨¡£ ´ð£º¶Ô AND ÐźÅÁ¿¼ÓÒÔÀ©³ä£¬ÐγɵÄÐźÅÁ¿¼¯ºÏµÄ¶Áд»úÖÆ¡£ ½â·¨£ºVarRNinteger; L,mx:semaphore:=RN,1;

13

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@) ËÕICP±¸20003344ºÅ-4 ceshi