¡¶²Ù×÷ϵͳ¡·¿Î³Ì×ÛºÏÁ·Ï°Ìâ ¼°´ð°¸ ÏÂÔØ±¾ÎÄ

return(item); } { count=0; in=0; out=0; } ½ø³Ì£º

producer,consumer producer£¨Éú²úÕß½ø³Ì£©; Item_Type item; {

while(true) {

produce(&item); buffer.enter( ); buffer.deposit(item); buffer.leave( ); } }

consumer£¨Ïû·ÑÕß½ø³Ì£©; Item_Type item; {

while(true) {

buffer.enter( ); item=buffer.fetch( ); buffer.leave( ); consume(&item); }

}

Áù¡¢ÔÚÒ»¸öҳʽ´æ´¢¹ÜÀíϵͳÖУ¬Ò³±íÄÚÈÝÈçÏÂËùʾ£º Ò³ºÅ ¿éºÅ 0 2 1 1 2 6 3 3 4 7 ÈôÒ³µÄ´óСΪ2K£¬ÔòµØÖ·×ª»»»ú¹¹½«Âß¼­µØÖ·4116ת»»³ÉµÄÎïÀíµØÖ·ÊÇʲô¡££¨ÇëдÃ÷¼ÆËã¹ý³Ì£©¡£ ´ð£º

Ò³ºÅp=INT(0/2048)=0¡­ Ò³ÄÚÆ«ÒÆw=mod(0/2048)¡­0

ÒÔÒ³ºÅΪË÷ÒýËÑË÷Ò³±íµÃµ½0ºÅÒ³ÃæËùÔÚµÄÎïÀí¿éºÅΪ2 ÎïÀíµØÖ·=ÎïÀí¿éºÅ*¿é´óС+Ò³ÄÚÆ«ÒÆ=2*£¨2*1024£©+0=4096

Æß¡¢Ð´³öʹÓüǼÐÍÐźÅÁ¿µÄwait(s)ºÍsignal(s)²Ù×÷µÄʵÏÖ£¬ËµÃ÷ÓëʹÓÃÕûÐÍÐźÅÁ¿Ïà±È£¬Ê¹ÓüǼÐÍÐźÅÁ¿ÓÐʲôÓŵ㡣 procedure wait(s) var s:semaphore begin

s.value:=s.value-1; if s.value<0 then block(s.L) end.

procedure signal(s) var s:semaphore begin

s.value:=s.value+1; if s.value<=0 then wakeup(s.L)

end.

¼Ç¼ÐÍÐźÅÁ¿½â¾öÉú²úÕß-Ïû·ÑÕßͬ²½ÎÊÌâµÄËã·¨£º

ÉèÖÃÒ»¸ö»¥³âÐźÅÁ¿£¬mutexÓÃÓÚʵÏÖ¶Ô¹«¹²»º³å³ØµÄ»¥³â·ÃÎÊ£¬³õֵΪ1¡£ ÉèÖÃÁ½¸öͬ²½ÐźÅÁ¿£¬·Ö±ð±íʾ¿ÉÓÃ×ÊÔ´Êý¡£ empty£º±íʾ¿Õ»º³åÇøÊý,³õֵΪn

full£º±íʾװÓвúÆ·µÄ»º³åÇøÊý£¬³õֵΪ0£¬(Ò»¸ö»º³åÇøÖзÅÒ»¸ö²úÆ·)

Producer: begin repeat ? produce an item in nextp; wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1)mod n

signal(mutex); signal(full)£» until false£¨3·Ö£©

Consumer: begin repeat ¡­ wait(full); wait(mutex); nextc:=buffer(out); out:=(out+1)mod n; signal(mutex);

signal(empty)£» consume item in nextc; until false;