问题:
模拟生产者-消费者问题
要求:设置1个消费者,1个生产者,共享一个空间为5的循环缓冲区,采用P,V操作
输出:
任意多次输入p或c,表示执行生产或消费,每次输出
1. 当前的缓冲区状态(空的格子用0,有物品的格子为1表示);
2. 相应信号量的值;
3. 若输入违反原则,则输出相应提示“缓冲区已满”或“缓冲区已空”;
思路:
1、生产者投放一个产品,输入指针in+1:
in=(in+1)%n;
其中,in初始值为0,n代表缓冲区个数
2、消费者每消费一个产品,输出指针out+1
out=(out+1)%n
out初值为0,n代表缓冲区个数;
3、引入一个公共信号量count,初值为0;
生产者每生产一个产品时,count++,count=n时不能再投放产品
消费者每取出一个产品时,count--,count=0时不能再取出产品
代码:
// 生产者-消费者问题.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdio.h>
#pragma warning(disable:4996)
int in=0,out=0;//输入输出指针
int count = 0;//信号量
int full = 1, empty = 0;//缓存区状态
int buffer[5];//循环缓冲区
int n = 5;
bool producer();
bool consumer();
void print();
int main()
{
char c;
printf_s("请输入操作p/c(p为生产,c为消费):");
while (scanf_s("%c",&c)!=EOF)
{
if (c=='p')
{
if (producer())
{
print();
}
}
else if (c=='c')
{
if (consumer())
{
print();
}
}
else
{
//printf("输入有误请重新输入!\n");
}
printf("\n请输入操作p/c(p为生产,c为消费):");
getchar();
}
return 0;
}
//生产者
bool producer()
{
if (count<n)
{
buffer[in] = full;
in = (in + 1) % n;
count++;
return true;
}
else
{
printf("缓存区已满!\n");
return false;
}
}
//消费者
bool consumer()
{
if (count>0)
{
buffer[out] = empty;
out = (out + 1) % n;
count--;
return true;
}
else
{
printf("缓冲区已空!\n");
return false;
}
}
//输出
void print()
{
printf("当前缓冲区状态: ");
for (int i = 0; i < n; i++)
{
if (buffer[i] == full)
{
printf("1 ");
}
else
{
printf("0 ");
}
}
printf("\n当前信号量值:%d\n", count);
}
运行结果: