1、操作系统概念第七版中的实验项目:生产者消费者问题。本程序中,main()函数需要 三个参数:主线程休眠时间;生产者线程数;消费者线程数。各线程的休眠等待时间是随机 的。程序代码:#include stdio h# includestdloilh# include#includewindows.h#define BUFFER_SIZE 5typedef int buffer_;itemstruct vint ;i);buffer_item bufferBUFFER_SIZE+1buffer_item front=0,re;ar=0HANDLE mutex , empty,full;int ins
2、ert_i(ebuffer_item item)/*insert item into bufferreturn 0 if successful,otherwisereturn-1 indicating an error cond/tionif(rear+1弘(BUFFER_SIZE+1)=front )return 1;bufferrear=itemrear=(rear+1)%(BUFFER_SIZE+1);return 0;int remove_item(buffer_item *item)/*remove an object from bufferplacing it in itemret
3、urn 0 if successful,otherwisereutrn-1 indication an error condition */if(front = r)earreturn ;1* item=buffef front;front=(front+) % (BUFFER_SIZE+1);return 0;DWORD WINAPI producer (PVOID Param ) int randlstruct v data=*(struct) Waram;srand(unsigned)time 0);while (1Sleep(rand()%101*10WaitForSingleObje
4、ctempty, INFINITE );WaitForSingleObject(mutexINFINITE );rand1 =ran();printf producer has producerd %d Byn%drand1 data i);if( insert_itemrand1)printf(insert data nrrb;r!ReleaseMutex(mutex)ReleaseSemaphore(full, NULL);DWORD WINAPI consumer(PVOID Param )int rand1;struct v data=struct v ) Param;srand(un
5、sign)edtime(0) ;while (1)Sleep (rand()%101* 10);WaitForSingleObject(f,ulIlNFINITE);WaitForSingleObjectmutex,INFINITE);if(remove_item &rand1 )printf(remove data errf,);elseprintf consumer consumed d By % d nn,rand1,data);ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL) ;int main(int argxhar *argv/*
6、 Get command line arguments argv)1( the number of producer threads), argtAh/ number of consumer thread,sargv3 (sleep ti)e*/* Initialize buffer int sleeptime,pnun$num; int *ThreadIdP*ThreadIdS,i; struct * countp* counts; HANDLE *ThreadHandleP,*ThreadHandleS; sleeptime=atoi(argv) pnum=atoi ( argv 2);
7、snum=atoi ( argv 3); /*srand( time (NULL); sleeptime=9;0 pnum=3; snum=3 ;*/ ThreadHandleP= ( HANDLE * ) malloc(pnum * sizeof(HANDLE); ThreadHandleS= ( HANDLE *) malloc ( snum * sizeof(HANDLE );ThreadIdP= ( int * )mallOpnum * sizeof in); ThreadIdS=(int* ) malloc ( pnum * sizeoff int); mutex=CreateMut
8、ex (NULL,FALSE,NULL ); empty=CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE , NULL ); full=CreateSemaphore(NULL 0,BUFFER_SIZE+1,NULL); /*Create producer thread(s) countp=(struct v)malloc(pnum+1)*sizeof(struqt v) counts=(struct v *)malloc(sn)um*+1sizeo(f struct)v ; for(i=0 i# include time。h#include#def
9、ine BUFFER-SIZE 5 typedef int buffer-item;struct v int i;);buffer-item buffer BUFFER-SIZE+1;buffer-item front=0, rear=0;HANDLE mutex, empty,full;int insert-item(buffer-item item)(/*insert item into bufferreturn 0 if successful,otherwisereturn -1 indicating an error condition* /if (rear+1)% (BUFFER-S
10、IZE + 1 ) =front)return 1;buffer rear =item;rear=(rear+1)%(BUFFER-SIZE+1);return 0;int remove-item(buffer-item *item)/*remove an object from bufferplacing it in itemreturn 0 if successful, otherwisereutrn -1 indication an error condition */if(front = rear)return 1;*item=bufferfront;front= ( front+1)
11、 % (BUFFER-SIZE+1);return 0;)DWORD WINAPI producer (PVOID Param) int randl;struct v data=* ( struct v *)Param;srand ( unsigned) time (0 );while ( 1)Sleep ( rand () %101 * 10);WaitForSingleObject (empty,INFINITE);WaitForSingleObject ( mutex, INFINITE);rand1 =rand ();printf (producer has producerd %d
12、By %dn”,rand1,data.i);if(insert_item(rand1)printf (insert data error!n);ReleaseMutex (mutex);ReleaseSemaphore (full, 1, NULL );)DWORD WINAPI consumer (PVOID Param)(int rand1;struct v data= * (struct v * ) Param;srand(unsigned)time(0);while (1)Sleep(rand()%101*10);WaitForSingleObject (full,INFINITE);
13、WaitForSingleObject ( mutex, INFINITE );if(remove_item(&rand1)printf(remove data error! n);elseprintf ( consumer consumed %d By % d n, rand1, data。i);ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL);)int main (int argc, char * argv )(/ * Get command line arguments argv1 ) (the number of producer t
14、hreads ) , argv2 (the number of consumer threads ) ,argv3 ( sleep time )* / * Initialize buffer * /int sleeptime, pnum, snum;DWORD *ThreadIdP,*ThreadIdS,i;struct v *countp,*counts;HANDLE *ThreadHandleP, * ThreadHandleS; /*sleeptime=atoi ( argv1); pnum=atoi ( argv2); snum=atoi (argv3); */ /srand(time
15、 ( NULL); sleeptime=90; pnum=3; snum=3; ThreadHandleP=(HANDLE * ) malloc (pnum * sizeof(HANDLE); ThreadHandleS= ( HANDLE * ) malloc (snum * sizeof ( HANDLE ); ThreadIdP=(DWORD * )malloc (pnum * sizeof(DWORD); ThreadIdS=(DWORD * )malloc ( pnum * sizeof ( DWORD ); mutex=CreateMutex(NULL, FALSE, NULL);
16、 empty=CreateSemaphore (NULL,BUFFER_SIZE, BUFFER_SIZE, NULL); full=CreateSemaphore (NULL, 0, BUFFER_SIZE+1,NULL); /*Create producer thread(s)*/ countp= ( struct v *) malloc(pnum+1 ) *sizeof (struct v); counts=(struct v *)malloc ( ( snum+1)*sizeof ( struct v); for ( i=0; ipnum; i+)countp i+1. i = i+1
17、ThreadHandleP i=CreateThread(NULL,0, producer, &countp i+1 ,0,&ThreadIdPi);)/ * Create consumer thread(s)*/for ( i=0; i snum; i+)counts i+1. i=i+1;ThreadHandleS i =CreateThread ( NULL,0, consumer, &counts i+1, 0,&ThreadIdS i); ) /*Sleep*/Sleep (sleeptime);/*Exit*/ return 0;consitmep conBunecl 32240
18、 By 2 pioclucep has prortuceirt 12873 By 3 consnmcr consuniccl 31438 By 1 viQducep Jias pro clue e pel 17194 By 2 tiiaduGer 如占 produtci&id 7511comsumeii: consumed 12229 By 3licet has prodiiceia 11032 By 2 consuinep cnmsuined 23121 By 1 piQducep has pro luce pi 144L7 By 1 consitmei consumed 12873 Ely
19、 2 piQclucer has prortuceirt 18? By 3 con a line i* conBumecl 17154 By 1 consumer consumed 751 By 3 consiLmer consumcdl 110B2 By 1 viQducer las producerd 28138 By 3 titaducer has pruduciGtd 8726 Ey 2 consumer consumed 14417 By 2 kiraiilucef has profluceia 6241 Ey 1 板rodiwe略 has: ppoduceFdl. 22192 By 2 consumer consumed 189? By 1 piDdiicei has ppodmceicl 17198 By 1 Press any hey to continue