{ int t, u; wait(s); x=0; t=0; if(x<1) t=t+z; u=t; signal(s); }
void main( )
{ parbegin(P1( ), P2( )); }
£¨6£©¹²Ïí´æ´¢ÇøÍ¨ÐÅÊÇÈçºÎʵÏֵģ¿
£¨7£©¼ÙÉèijϵͳδֱ½ÓÌṩÐźÅÁ¿»úÖÆ£¬µ«ÌṩÁ˽ø³ÌͨÐŹ¤¾ß¡£Èç¹ûij³ÌÐòÏ£ÍûʹÓùØÓÚÐźÅÁ¿µÄwait¡¢signal²Ù×÷£¬ÄÇô¸Ã³ÌÐòÓ¦ÈçºÎÀûÓÃͨÐŹ¤¾ßÄ£ÄâÐźÅÁ¿»úÖÆ£¿ÒªÇó˵Ã÷ÈçºÎÓÃsend/receive²Ù×÷¼°ÏûÏ¢±íʾwait/signal²Ù×÷¼°ÐźÅÁ¿¡£ 5£®Ó¦ÓÃÌâ
£¨1£©ÓÐÈý¸ö²¢·¢½ø³ÌR¡¢W1ºÍW2£¬¹²ÏíÁ½¸ö¸÷¿É´æ·ÅÒ»¸öÊýµÄ»º³åÇøB1¡¢B2¡£½ø³ÌRÿ´Î´ÓÊäÈëÉ豸¶ÁÈëÒ»¸öÊý£¬Èô¶ÁÈëµÄÊÇÆæÊý£¬Ôò½«Ëü´æÈëB1ÖУ¬Èô¶ÁÈëµÄÊÇżÊý£¬½«Ëü´æÈëB2ÖУ»µ±B1ÖÐÓÐÊý£¬Óɽø³ÌW1½«Æä´òÓ¡Êä³ö£»µ±B2ÖÐÓÐÊý£¬½ø³ÌW2½«Æä´òÓ¡Êä³ö¡£ÊÔ±àд±£Ö¤ÈýÕßÕýÈ·¹¤×÷µÄ³ÌÐò¡£
struct semaphone B1_Empty, B1_Full, B2_Empty, B2_Full; B1_Empty.value=1; B1_Full.value=0; B2_Empty.value=1; B2_Full.value=0; void R( ) { int a; While(1)
{ read a number a; if(a%2==1) { wait(B1_Empty);
put a in B1; signal(B1_Full);
} else
{ wait(B2_Empty);
put a in B2; signal(B2_Full);
} } } void W1( ) { while(1)
{ wait(B1_Full); print a number from B1; signal(B1_Empty); } }
void W2( ) { while(1) { wait(B2_Full); print a number from B2; signal(B2_Empty); } }
void main( )
{ parbegin(R( ), W1( ), W2( )); }
£¨2£©8¸öÐ×÷µÄÈÎÎñA¡¢B¡¢C¡¢D¡¢E¡¢F¡¢G¡¢H·Ö±ðÍê³É¸÷×ԵŤ×÷¡£ËüÃÇÂú×ãÏÂÁÐÌõ¼þ£ºÈÎÎñA±ØÐëÁìÏÈÓÚÈÎÎñB¡¢CºÍE£»ÈÎÎñEºÍD±ØÐëÁìÏÈÓÚÈÎÎñF£»ÈÎÎñBºÍC±ØÐëÁìÏÈÓëÈÎÎñD£»¶øÈÎÎñF±ØÐëÁìÏÈÓÚÈÎÎñGºÍH¡£ÊÔд³ö²¢·¢³ÌÐò£¬Ê¹µÃÔÚÈκÎÇé¿öÏÂËüÃǾùÄÜÕýÈ·¹¤×÷¡£
£¨3£©¶à¸ö½ø³Ì¹²ÏíÒ»¸öÎļþ£¬ÆäÖÐÖ»¶ÁÎļþµÄ³ÆÎª¶ÁÕߣ¬Ö»Ð´ÎļþµÄ³ÆÎªÐ´Õß¡£¶ÁÕß¿ÉÒÔͬʱ¶Á£¬µ«Ð´ÕßÖ»ÄܶÀÁ¢Ð´¡£ÎÊ£º
1£©ËµÃ÷½ø³Ì¼äµÄÖÆÔ¼¹ØÏµ£¬Ó¦ÉèÖÃÄÄЩÐźÅÁ¿£¿ 2£©ÓÃwait¡¢signal²Ù×÷д³öÆäͬ²½³ÌÐò¡£
3£©ÐÞ¸ÄÉÏÊöËã·¨£¬Ê¹µÃËü¶ÔдÕßÓÅÏÈ£¬¼´Ò»µ©ÓÐдÕßµ½´ï£¬ºóÐøµÄ¶ÁÕß±ØÐëµÈ´ý¡£¶øÎÞÂÛÊÇ·ñÓжÁÕßÔÚ¶ÁÎļþ¡£
¼û½Ì²Ä¡°¶ÁÕß-дÕßÎÊÌ⡱
£¨4£©×ÀÉÏÓÐÒ»¿ÕÅÌ£¬¿É·Åһֻˮ¹û¡£°Ö°Ö¿ÉÏòÅÌÖÐ·ÅÆ»¹û£¬Ò²¿ÉÏòÅÌÖзŽÛ×Ó£»¶ù×ÓרµÈ³ÔÅÌÖеĽÛ×Ó£»Å®¶ùרµÈ³ÔÅÌÖÐµÄÆ»¹û¡£¹æ¶¨Ò»´ÎÖ»ÄÜ·Åһֻˮ¹û£¬ÊÔд³ö°Ö°Ö¡¢¶ù×Ó¡¢Å®¶ùÕýȷͬ²½µÄ³ÌÐò¡£
struct semaphone plate, apple, orange; plate.value=1; apple.value=0; orange.value=0; void father( ) { while(1)
{ prepare an apple or orange; wait(plate); put the apple or orange in plate; if(Apple) signal(apple); //Èç¹û·ÅµÄÊÇÆ»¹û else signal(orange); //Èç¹û·ÅµÄÊǽÛ×Ó }
} void son( ) { while(1)
{ wait(orange); get an orange from the plate; signal(plate); } }
void daughter( ) { while(1) { wait(apple); get an apple from the plate; signal(plate); } }
Void main( )
£¨5£©Èý¸ö½ø³ÌP1¡¢P2¡¢P3»¥³âʹÓÃÒ»¸ö°üº¬N£¨N>0£©¸öµ¥ÔªµÄ»º³åÇø¡£P1ÿ´ÎÓÃprocuce£¨£©Éú³ÉÒ»¸öÕýÕûÊý²¢ÓÃput£¨£©ËÍÈ뻺³åÇøÄ³Ò»¿Õµ¥ÔªÖУ»P2ÿ´ÎÓÃgetodd£¨£©´Ó¸Ã»º³åÇøÖÐÈ¡³öÒ»¸öÆæÊý²¢ÓÃcountodd£¨£©Í³¼ÆÆæÊý¸öÊý£»P3ÿ´ÎÓÃgeteven£¨£©´Ó¸Ã»º³åÇøÖÐÈ¡³öÒ»¸öżÊý²¢ÓÃcounteven£¨£©Í³¼ÆÅ¼Êý¸öÊý¡£ÇëÓÃÐźÅÁ¿»úÖÆÊµÏÖÕâÈý¸ö½ø³ÌµÄͬ²½Ó뻥³â»î¶¯£¬²¢ËµÃ÷Ëù¶¨ÒåµÄÐźÅÁ¿µÄº¬Òå¡£ÒªÇóÓÃα´úÂëÃèÊö£¨2009ÄêÈ«¹ú˶ʿÑо¿ÉúÈëѧ¿¼ÊÔÌ⣩¡£
struct semaphone full_odd, full_even, mutex, empty; full_odd.value=0; full_even.value=0; mutex.value=1; empty.value=N; void P1( ) { int X; while(1)
{ X=produce( ); wait(empty); wait(mutex); put( ); if(X%2==0) signal(full_even); else signal(full_odd); signal(mutex); } }
void P2( )
{ wait(full_odd); wait(mutex); getodd( );
countodd( )=countodd( )+1; signal(empty); signal(mutex); }
void P3( )
{ wait(full_even); wait(mutex); geteven( ); counteven( )=counteven( )+1; signal(empty); signal(mutex); }
void main( )
{ parbegin(P1( ), P2( ), P3( )); }
£¨6£©·ÅСÇòÎÊÌ⣺һ¸öÏä×ÓÀïÖ»Óа×É«ºÍºÚÉ«Á½ÖÖСÇò£¬ÇÒÊýÁ¿×ã¹»¶à¡£ÏÖÔÚÐèÒª´ÓÖÐÈ¡³öһЩСÇò·ÅÈëÒ»¸ö´ü×ÓÖС£Ô¼¶¨£º1£©Ò»´ÎÖ»ÄÜ·ÅÈëÒ»¸öСÇò£»2£©°×ÇòµÄÊýÁ¿ÖÁ¶àÖ»ÄܱȺÚÇòÉÙN¸ö£¬ÖÁ¶àÖ»ÄܱȺÚÇò¶àM¸ö£¨M£¬NΪÕýÕûÊý£©¡£ÇëÓÃÐźÅÁ¿»úÖÆÊµÏÖ½ø³ÌµÄͬ²½Ó뻥³â¡£
struct semaphone mutex1, mutex2; int black=0, white=0; mutex1.value=1; mutex2.value=1; void put( ) { while(1)
{ wait(mutex1);
get a black ball or white ball from the box; signal(mutex1); wait(mutex2);
if(Black) //Èç¹ûÈ¡µ½µÄÊǺÚÇò if(black-white void main( )
Ïà¹ØÍÆ¼ö£º