程序代码:
#include 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 buffer return 0 if successful,otherwise return -1 indicating an error condition*/ if((rear+1)%(BUFFER_SIZE+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 buffer placing it in item return 0 if successful,otherwise reutrn -1 indication an error condition */ if(front == rear) return 1; *item=buffer[front]; front=(front+1) % (BUFFER_SIZE+1); return 0; } DWORD WINAPI producer(PVOID Param) { int rand1; 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 By %d\\n\ 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); WaitForSingleObject(mutex,INFINITE); if(remove_item(&rand1)) printf(\"remove data error! \\n\"); else printf(\"consumer consumed %d By %d \\n\ ReleaseMutex(mutex); ReleaseSemaphore(empty,1,NULL); } } int main(int argc,char *argv[]) { /*Get command line arguments argv[1])(the number of producer threads),argv[2](the number of consumer threads),argv[3](sleep time)*/ } /*Initialize buffer*/ int sleeptime,pnum,snum; int *ThreadIdP,*ThreadIdS,i; struct v *countp,*counts; HANDLE *ThreadHandleP,*ThreadHandleS; sleeptime=atoi(argv[1]); pnum=atoi(argv[2]); snum=atoi(argv[3]); /*srand(time(NULL)); sleeptime=9000; pnum=3; snum=3;*/ ThreadHandleP=(HANDLE * )malloc(pnum * sizeof(HANDLE)); ThreadHandleS=(HANDLE * )malloc(snum * sizeof(HANDLE)); ThreadIdP=(int * )malloc(pnum * sizeof(int)); ThreadIdS=(int * )malloc(pnum * sizeof(int)); mutex=CreateMutex(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(struct v)); counts=(struct v *)malloc((snum+1)*sizeof(struct v)); for(i=0;i Sleep(sleeptime); /*Exit*/ return 0; 因篇幅问题不能全部显示,请点此查看更多更全内容