生产者消费者同步问题的算法实现.docx
《生产者消费者同步问题的算法实现.docx》由会员分享,可在线阅读,更多相关《生产者消费者同步问题的算法实现.docx(8页珍藏版)》请在冰点文库上搜索。
生产者消费者同步问题的算法实现
生产者消费者同步问题的算法实现
一、实验目的:
全面理解生产者与消费者问题模型,掌握解决该问题的算法思想,正确使用同步机制。
二、实验内容:
问题描述:
一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。
假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。
功能要求:
根据进程同步机制,编写一个解决上述问题的演示程序,可显示缓冲池状态、放数据、取数据等过程。
三、编程工具:
C、Java、VC或其它可视化语言
平台任选
四、具体设计要求及有关说明
1.有3个生产者进程,分别为P1、P2和P3;
2.有4个消费者进程,分别是C1、C2、C3和C4;
3.缓冲区单元个数N=15;
4.不同的生产进程可生产不同的产品(比如字母、数字、符号);不同的消费进程可有不同的消费方式(比如“显示”、“打印”、“拼接成字符串”、“改变大小写”等)。
自己可任意定义。
实现代码:
#include
#include
voidmain()
{
intfull=0;//用于判断缓冲池是否为满
intemputy=15;//用于判断缓冲池时候为空
charbuffer[15][10];//用于存放产品
charch[10];//用于接收生产的产品和消费的产品
inti=0,j=0;
intnum;
intnumber;
intnumb;
printf("----------------------------------产品使用说明-------------------------------\n");
printf("1生产者生产产品\n");
printf("2消费者消费产品\n");
printf("3生产字母产品\n");
printf("4生产数字产品\n");
printf("5生产符号产品\n");
printf("6消费方式(显示)\n");
printf("7消费方式(打印)\n");
printf("8消费方式(全部变成小写)\n");
printf("9消费方式(全部变成大写)\n");
printf("-----------------------------------------------------------------------------\n");
while(true)
{
printf("请输入1或者2进行生产或消费:
");
scanf("%d",&num);
if(num==1)//当num为1的时候,生产者生产产品
{
printf("请输入3或者4或者5生产不同的产品:
");//当number为3时生产字符,为4时生产数字,为5时生产字符
scanf("%d",&number);
//以下生产字符
if(number==3)
{
if(full==15)
{
printf("产品已满!
\n");
}
if(full<15)
{
printf("请输入生产的产品:
");
scanf("%s",&ch);
for(j=0;j{
buffer[i][j]=ch[j];
}
j++;
buffer[i][j]='\0';
i++;
full++;
emputy--;
printf("产品生产成功!
产品为:
%s\n",buffer[i-1]);
}
}//if(number==3)结束
//以下生产数字
if(number==4)
{
if(full==15)
{
printf("产品已满!
\n");
}
if(full<15)
{
printf("请输入生产的产品:
");
scanf("%s",&ch);
for(j=0;j{
buffer[i][j]=ch[j];
}
j++;
buffer[i][j]='\0';
i++;
full++;
emputy--;
printf("产品生产成功!
产品为:
%s\n",buffer[i-1]);
}
}//if(number==4)结束
//以下生产字符
if(number==5)
{
if(full==15)
{
printf("产品已满!
\n");
}
if(full<15)
{
printf("请输入生产的产品:
");
scanf("%s",&ch);
for(j=0;j{
buffer[i][j]=ch[j];
}
j++;
buffer[i][j]='\0';
i++;
full++;
emputy--;
printf("产品生产成功!
产品为:
%s\n",buffer[i-1]);
}
}//if(number==5)结束
}//if(num==1)结束
if(num==2)//当num为2时,消费者消费产品
{
printf("请输入6或者7或者8或者9选择不同消费方式:
");//当numb为6时显示,为7时打印,为8时转换成小写,为9时转换成大写
scanf("%d",&numb);
//以下为显示消费模式
if(numb==6)
{
if(emputy<15)
{
i--;
emputy++;
full--;
printf("消费成功!
显示:
%s\n",buffer[i]);
}
else
{
printf("产品为空!
\n");
}
}//if(numb==6)结束
//以下为打印消费模式
if(numb==7)
{
if(emputy<15)
{
i--;
emputy++;
full--;
printf("消费成功!
打印:
%s\n",buffer[i]);
}
else
{
printf("产品为空!
\n");
}
}//if(numb==7)结束
//以下为转换成小写消费模式
if(numb==8)
{
if(emputy<15)
{
i--;
emputy++;
full--;
printf("消费成功!
转换成小写:
%s\n",strlwr(buffer[i]));
}
else
{
printf("产品为空!
\n");
}
}//if(numb==8)结束
//以下为转换成大写消费模式
if(numb==9)
{
if(emputy<15)
{
i--;
emputy++;
full--;
printf("消费成功!
转换成大写:
%s\n",strupr(buffer[i]));
}
else
{
printf("产品为空!
\n");
}
}//if(numb==9)结束
}//if(num==2)结束
}//while结束
}//main()结束