您的当前位置:首页正文

生产者消费者问题C语言

2022-08-08 来源:客趣旅游网
《操作系统概念》第七版 中的实验项目:生产者消费者问题。本程序中,main()函数需要三个参数:主线程休眠时间;生产者线程数;消费者线程数。各线程的休眠等待时间是随机的。

程序代码:

#include #include #include #include #define 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 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/*Create consumer thread(s)*/ for(i=0;i/*Sleep*/

Sleep(sleeptime); /*Exit*/ return 0;

因篇幅问题不能全部显示,请点此查看更多更全内容