操作系统生产者消费者问题C语言.doc
- 文档编号:1225212
- 上传时间:2023-04-30
- 格式:DOC
- 页数:7
- 大小:53.50KB
操作系统生产者消费者问题C语言.doc
《操作系统生产者消费者问题C语言.doc》由会员分享,可在线阅读,更多相关《操作系统生产者消费者问题C语言.doc(7页珍藏版)》请在冰点文库上搜索。
《操作系统概念》第七版中的实验项目:
生产者消费者问题。
本程序中,main()函数需要三个参数:
主线程休眠时间;生产者线程数;消费者线程数。
各线程的休眠等待时间是随机的。
程序代码:
#include
#include
#include
#include
#defineBUFFER_SIZE5
typedefintbuffer_item;
structv
{
inti;
};
buffer_itembuffer[BUFFER_SIZE+1];
buffer_itemfront=0,rear=0;
HANDLEmutex,empty,full;
intinsert_item(buffer_itemitem)
{
/*insertitemintobuffer
return0ifsuccessful,otherwise
return-1indicatinganerrorcondition*/
if((rear+1)%(BUFFER_SIZE+1)==front)
return1;
buffer[rear]=item;
rear=(rear+1)%(BUFFER_SIZE+1);
return0;
}
intremove_item(buffer_item*item)
{
/*removeanobjectfrombuffer
placingitinitem
return0ifsuccessful,otherwise
reutrn-1indicationanerrorcondition*/
if(front==rear)
return1;
*item=buffer[front];
front=(front+1)%(BUFFER_SIZE+1);
return0;
}
DWORDWINAPIproducer(PVOIDParam)
{
intrand1;
structvdata=*(structv*)Param;
srand((unsigned)time(0));
while
(1)
{
Sleep(rand()%101*10);
WaitForSingleObject(empty,INFINITE);
WaitForSingleObject(mutex,INFINITE);
rand1=rand();
printf("producerhasproducerd%dBy%d\n",rand1,data.i);
if(insert_item(rand1))
printf("insertdataerror!
\n");
ReleaseMutex(mutex);
ReleaseSemaphore(full,1,NULL);
}
}
DWORDWINAPIconsumer(PVOIDParam)
{
intrand1;
structvdata=*(structv*)Param;
srand((unsigned)time(0));
while
(1)
{
Sleep(rand()%101*10);
WaitForSingleObject(full,INFINITE);
WaitForSingleObject(mutex,INFINITE);
if(remove_item(&rand1))
printf("removedataerror!
\n");
else
printf("consumerconsumed%dBy%d\n",rand1,data.i);
ReleaseMutex(mutex);
ReleaseSemaphore(empty,1,NULL);
}
}
intmain(intargc,char*argv[])
{
/*Getcommandlineargumentsargv[1])(thenumberofproducerthreads),argv[2](thenumberofconsumerthreads),argv[3](sleeptime)*/
/*Initializebuffer*/
intsleeptime,pnum,snum;
int*ThreadIdP,*ThreadIdS,i;
structv*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);
/*Createproducerthread(s)*/
countp=(structv*)malloc((pnum+1)*sizeof(structv));
counts=(structv*)malloc((snum+1)*sizeof(structv));
for(i=0;i { countp[i+1].i=i+1; ThreadHandleP[i]=CreateThread(NULL,0,producer,&countp[i+1],0,&ThreadIdP[i]); } /*Createconsumerthread(s)*/ for(i=0;i { counts[i+1].i=i+1; ThreadHandleS[i]=CreateThread(NULL,0,consumer,&counts[i+1],0,&ThreadIdS[i]); } /*Sleep*/ Sleep(sleeptime); /*Exit*/ return0; } #include"stdafx.h" #include #include #include #include #defineBUFFER_SIZE5 typedefintbuffer_item; structv { inti; }; buffer_itembuffer[BUFFER_SIZE+1]; buffer_itemfront=0,rear=0; HANDLEmutex,empty,full; intinsert_item(buffer_itemitem) { /*insertitemintobuffer return0ifsuccessful,otherwise return-1indicatinganerrorcondition*/ if((rear+1)%(BUFFER_SIZE+1)==front) return1; buffer[rear]=item; rear=(rear+1)%(BUFFER_SIZE+1); return0; } intremove_item(buffer_item*item) { /*removeanobjectfrombuffer placingitinitem return0ifsuccessful,otherwise reutrn-1indicationanerrorcondition*/ if(front==rear) return1; *item=buffer[front]; front=(front+1)%(BUFFER_SIZE+1); return0; } DWORDWINAPIproducer(PVOIDParam) { intrand1; structvdata=*(structv*)Param; srand((unsigned)time(0)); while (1) { Sleep(rand()%101*10); WaitForSingleObject(empty,INFINITE); WaitForSingleObject(mutex,INFINITE); rand1=rand(); printf("producerhasproducerd%dBy%d\n",rand1,data.i); if(insert_item(rand1)) printf("insertdataerror! \n"); ReleaseMutex(mutex); ReleaseSemaphore(full,1,NULL); } } DWORDWINAPIconsumer(PVOIDParam) { intrand1; structvdata=*(structv*)Param; srand((unsigned)time(0)); while (1) { Sleep(rand()%101*10); WaitForSingleObject(full,INFINITE); WaitForSingleObject(mutex,INFINITE); if(remove_item(&rand1)) printf("removedataerror! \n"); else printf("consumerconsumed%dBy%d\n",rand1,data.i); ReleaseMutex(mutex); ReleaseSemaphore(empty,1,NULL); } } intmain(intargc,char*argv[]) { /*Getcommandlineargumentsargv[1])(thenumberofproducerthreads),argv[2](thenumberofconsumerthreads),argv[3](sleeptime)*/ /*Initializebuffer*/ intsleeptime,pnum,snum; DWORD*ThreadIdP,*ThreadIdS,i; structv*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=(DWORD*)malloc(pnum*sizeof(DWORD)); ThreadIdS=(DWORD*)malloc(pnum*sizeof(DWORD)); mutex=CreateMutex(NULL,FALSE,NULL); empty=CreateSemaphore(NULL,BUFFER_SIZE,BUFFER_SIZE,NULL); full=CreateSemaphore(NULL,0,BUFFER_SIZE+1,NULL); /*Createproducerthread(s)*/ countp=(structv*)malloc((pnum+1)*sizeof(structv)); counts=(structv*)malloc((snum+1)*sizeof(structv)); for(i=0;i { countp[i+1].i=i+1; ThreadHandleP[i]=CreateThread(NULL,0,producer,&countp[i+1],0,&ThreadIdP[i]); } /*Createconsumerthread(s)*/ for(i=0;i { counts[i+1].i=i+1; ThreadHandleS[i]=CreateThread(NULL,0,consumer,&counts[i+1],0,&ThreadIdS[i]); } /*Sleep*/ Sleep(sleeptime); /*Exit*/ return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 生产者 消费者 问题 语言