操作系统生产者消费者问题C语言.doc

上传人:wj 文档编号:1225212 上传时间:2023-04-30 格式:DOC 页数:7 大小:53.50KB
下载 相关 举报
操作系统生产者消费者问题C语言.doc_第1页
第1页 / 共7页
操作系统生产者消费者问题C语言.doc_第2页
第2页 / 共7页
操作系统生产者消费者问题C语言.doc_第3页
第3页 / 共7页
操作系统生产者消费者问题C语言.doc_第4页
第4页 / 共7页
操作系统生产者消费者问题C语言.doc_第5页
第5页 / 共7页
操作系统生产者消费者问题C语言.doc_第6页
第6页 / 共7页
操作系统生产者消费者问题C语言.doc_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统生产者消费者问题C语言.doc

《操作系统生产者消费者问题C语言.doc》由会员分享,可在线阅读,更多相关《操作系统生产者消费者问题C语言.doc(7页珍藏版)》请在冰点文库上搜索。

操作系统生产者消费者问题C语言.doc

《操作系统概念》第七版中的实验项目:

生产者消费者问题。

本程序中,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模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2