²Ù×÷ϵͳʵÑéÌâÄ¿¼°ÊµÑ鱨¸æÒªÇó - ͼÎÄ

loading ·ÖÏí 2026-9-1 ÏÂÔØÎĵµ

ͼ4-3 Éú²úÕߺÍÏû·ÑÕß³ÌÐò

³õʼ»¯³ÌÐò£ºÄ£ÄâʵÑéµÄ³ÌÐò´Ó³õʼ»¯³ÌÐòÈë¿ÚÆô¶¯£¬³õʼ»¯¹¤×÷°üÀ¨¶ÔÐźÅÁ¿S1¡¢S2¸³³õÖµ£¬¶ÔÉú²úÕß¡¢Ïû·ÑÕß½ø³ÌµÄPCB³õʼ»¯¡£³õʼ»¯ºóתÏò´¦ÀíÆ÷µ÷¶È³ÌÐò£¬ÆäÁ÷³ÌÈçͼ4-4

´¦ÀíÆ÷µ÷¶È³ÌÐò£ºÔÚ¼ÆËã»úϵͳÖУ¬½ø³Ì²¢·¢Ö´ÐÐʱ£¬ÈÎÒ»½ø³ÌÕ¼Óô¦ÀíÆ÷Ö´ÐÐÍêÒ»ÌõÖ¸Áîºó¾ÍÓпÉÄܱ»´ò¶Ï¶øÈóö´¦ÀíÆ÷ÓÉÆäËû½ø³ÌÔËÐС£¹ÊÔÚÄ£ÄâϵͳÖÐÒ²ÀàËÆ´¦Àí£¬Ã¿µ±Ö´ÐÐÒ»ÌõÄ£ÄâµÄÖ¸Áîºó£¬±£»¤µ±Ç°½ø³ÌµÄÏÖ³¡£¬ÈÃËü³ÉΪ·ÇÔËÐÐ״̬£¬ÓÉ´¦ÀíÆ÷µ÷¶È³ÌÐò°´Ëæ»úÊýÔÙÑ¡ÔñÒ»¸ö¾ÍÐ÷½ø³ÌÕ¼Óô¦ÀíÆ÷ÔËÐС£´¦ÀíÆ÷µ÷¶È³ÌÐòÁ÷³Ì¼ûͼ4-5¡£

¿ªÊ¼

³õʼ»¯ÐźÅÁ¿S1£¬S2 S1:=10£¬S2:=0 Éú²úÕߺÍÏû·ÑÕß½ø³ÌµÄPCBÖÐ״̬Ϊ¾ÍÐ÷£¬¶ÏµãΪ0 ½«ÏÖÐнø³ÌÖÃΪÉú²úÕß½ø³Ì£¬PC:=0 ´¦ÀíÆ÷µ÷¶È³ÌÐò ½áÊø ͼ 4-4 ³õʼ»¯Á÷³Ì

Ä£Äâ´¦ÀíÆ÷Ö¸ÁîÖ´ÐгÌÐò£º°´¡°Ö¸Áî¼ÆÊýÆ÷¡±PCÖ®ÖµÖ´ÐÐÖ¸¶¨µÄÖÊÁ¿£¬ÇÒPC¼Ó1Ö¸ÏòÏÂÒ»ÌõÖ¸ÁģÄâ´¦ÀíÆ÷Ö¸ÁîÖ´ÐеijÌÐòÁ÷³Ì¼ûͼ4-6ºÍ4-7¡£

ÁíÍ⣬ΪÁËʹµÃÄ£Äâ³ÌÐòÓÐÒ»¸ö½áÊøÌõ¼þ£¬ÔÚͼ4-6Öи½¼ÓÁË¡°Éú²úÕßÔËÐнáÊø¡±µÄÌõ¼þÅжϣ¬Ä£Äâʱ¿ÉÒÔ²ÉÈ¡È˹¤Ñ¡ÔñµÄ·½·¨ÊµÏÖ¡£Í¼4-7¸ø³öÁËP£¨S£©ºÍV£¨S£©Ä£ÄâÖ¸ÁîÖ´Ðйý³ÌµÄÁ÷³Ì¡£ÆäËûÄ£ÄâÖ¸ÁîµÄÖ´Ðйý³ÌÒÑÔÚͼ4-2ÖÐÖ¸³ö¡£

ËÄ¡¢ÊµÑ鱨¸æ

£¨1£© ʵÑéÌâÄ¿¡£

£¨2£© ´òÓ¡Ô´³ÌÐò²¢¸½ÉÏ×¢ÊÍ¡£

£¨3£© ´Ó¼üÅÌÉÏÊäÈëÒ»×é×Ö·û£¬ÓÉÉú²úÕßÿ´Î¶ÁÈëÒ»¸ö×Ö·û¹©Ïû·ÑÕßÊä³ö¡£ÔËÐÐÄ£Äâ³ÌÐò£¬

´òÓ¡ÒÀ´Î¶ÁÈëµÄ×Ö·ûºÍÏû·ÑÕßÊä³öµÄ×Ö·û¡£

£¨4£© °ÑÉú²úÕߺÍÏû·ÑÕß½ø³ÌÖеÄP²Ù×÷¡¢V²Ù×÷¶¼¸Ä³É¿Õ²Ù×÷Ö¸Á¹Û²ìÔÚÁ½Õß²»Í¬²½µÄÇé

¿öÏ¿ÉÄܳöÏÖµÄÓëʱ¼äÓйصĴíÎó¡£´òÓ¡ÒÀ´Î¶ÁÈëµÄ×Ö·ûºÍÏû·ÑÕßÊä³öµÄ×Ö·û¡£

j:=PA[i] ¿ªÊ¼ ±£»¤ÏÖ³¡£¬PC=>µ±Ç°½ø³ÌPCBµÄ¶Ïµã ·ñ ÓоÍÐ÷½ø³Ì£¿ ÊÇ ½áÊø Ëæ¼´Ñ¡Ôñ¡ª¾ÍÐ÷½ø³Ì×÷Ϊ½«ÏÖÐнø³Ì״̬¸ÄΪÔËÐÐÏÖÐнø³ÌPCBµÄ¶ÏµãÖµ=>PC Ä£Äâ´¦ÀíÆ÷Ö¸ÁîÖ´ÐгÌÐò ͼ4-5´¦ÀíÆ÷µ÷¶È³ÌÐòÁ÷³Ì

¿ªÊ¼ j:=PC ÊÇ ÏÖÐнø ³ÌΪÉú²úÕߣ¿ ·ñ j:=SA[i]

ͼ 4-6 Ä£Äâ´¦ÀíÆ÷Ö¸ÁîÖ´ÐÐ ¿ªÊ¼ S¡ûS-1 ·ñ S<0 ÊÇ ½«µ÷ÓÃP(s)¹ý³ÌµÄ½«µ÷ÓÃP(s)¹ý³ÌµÄ½ø½ø³ÌÖÃΪ¾ÍÐ÷ ¿ªÊ¼ S¡ûS+1 ·ñ S<0 ÊÇ ÕÒÒ»¸öµÈ´ýsÐźÅÁ¿µÄ½ø³ÌÖÃΪ¾ÍÐ÷̬

£¨1£©Ä£ÄâP£¨S£© £¨2£©Ä£ÄâV£¨S£©

ͼ 4-7 Ä£ÄâPV²Ù×÷µÄÖ´ÐÐ

Èý¡¢ÊµÑéÒªÇó

1¡¢ linux²Ù×÷ϵͳ 2¡¢ Windows²Ù×÷ϵͳ

ËÄ¡¢Ö÷ҪʵÑé²½Öè

linux²Ù×÷ϵͳϵIJÙ×÷²½Ö裺 gedit semaphore.c (±à¼­³ÌÐò)

gcc ¨Co semaphore semaphore.c £¨±àÒë¡¢Á´½Ó³ÌÐò£© ./semaphore£¨Ö´ÐгÌÐò£©

Î塢ʵÑéÊý¾Ý¼°´¦Àí½á¹û

´úÂë#include

#include

const unsigned short SIZE_OF_BUFFER = 10; //»º³åÇø³¤¶È unsigned short ProductID = 0; //²úÆ·ºÅ

unsigned short ConsumeID = 0; //½«±»ÏûºÄµÄ²úÆ·ºÅ

unsigned short in = 0; //²úÆ·½ø»º³åÇøÊ±µÄ»º³åÇøÏ±ê unsigned short out = 0; //²úÆ·³ö»º³åÇøÊ±µÄ»º³åÇøÏ±ê int g_buffer[SIZE_OF_BUFFER]; //»º³åÇøÊǸöÑ­»·¶ÓÁÐ bool g_continue = true; //¿ØÖƳÌÐò½áÊø HANDLE g_hMutex; //ÓÃÓÚÏ̼߳äµÄ»¥³â

HANDLE g_hFullSemaphore; //µ±»º³åÇøÂúʱÆÈʹÉú²úÕߵȴý HANDLE g_hEmptySemaphore; //µ±»º³åÇø¿ÕʱÆÈʹÏû·ÑÕߵȴý DWORD WINAPI Producer(LPVOID); //Éú²úÕßÏß³Ì DWORD WINAPI Consumer(LPVOID); //Ïû·ÑÕßÏß³Ì


²Ù×÷ϵͳʵÑéÌâÄ¿¼°ÊµÑ鱨¸æÒªÇó - ͼÎÄ.doc ½«±¾ÎĵÄWordÎĵµÏÂÔØµ½µçÄÔ
ËÑË÷¸ü¶à¹ØÓÚ£º ²Ù×÷ϵͳʵÑéÌâÄ¿¼°ÊµÑ鱨¸æÒªÇó - ͼÎÄ µÄÎĵµ
Ïà¹ØÍÆ¼ö
Ïà¹ØÔĶÁ