用c语言实现“生产者和消费者”问题

实验要求:要求程序运行时,按任意键停止,显示各种信息

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
int mutex=1;
int empty=10;
int full=0;
int buf[10];
int front=0,rear=0;
int i;
//p操作 .申请 
void p(int *x)
{
	*x=(*x)-1;	
}
//v操作 .释放 
void v(int *x)
{
	*x=(*x)+1;	
}

void produce_thing(int *x)
{
	*x='p';
	
 } 
void enter_thing(int x)
{
	buf[front]=x;
	printf("输入一个%c到buf[%d]中\n",buf[front],front);
	front=(front+1)%10;
 } 
void nazou_thing(int *y)
{
	printf("从buf[%d]中取走%c,", rear,buf[rear]);
	*y=buf[rear];
	buf[rear]='q';
	rear=(rear+1)%10; 
}

void xiaohao_thing(int y)
{
	printf("消耗buf取出的产品%c\n",y);
	}	

void producer(void);
void consumer(void);


void producer(void)
{
	int a;
	while(1)
	{
		Sleep(1000);
		produce_thing(&a);
	    p(&empty);
		p(&mutex);
		enter_thing(a);
		if(kbhit())
{
			printf("生产者生产了%d个产品\n",front);
		//	printf("消费者消费了%d个产品",rear);
		    printf("生产者进行,消费者等待\n"); 
			system("pause");
}
		v(&mutex);
		v(&full);
		
		if(full!=10)
        {
		if(suijishu(i)==1)
        	producer();
        else
			consumer();	
	    }
	    else
			consumer();
		//if(full==10)
		// consumer();
	}
}
void consumer(void)
{
	int b;
	while(1)
	{
		Sleep(1000);
		p(&full);
		p(&mutex);
		nazou_thing(&b);
		
		v(&mutex); 
		v(&empty);
		xiaohao_thing(b);
		if(kbhit())
{
		//	printf("生产者生产了%d个产品",front);
			printf("消费者消费了%d个产品\n",rear);
			printf("消费者进行,生产者等待\n");
			system("pause");
}       
		if(empty!=10)
        {
		if(suijishu(i)==0)
        	consumer();
        else
			producer();	
	    }
	    else
			producer();
	}
}

suijishu(int i)//建立随机数,对是进行消费还是生产进行判断 
{
	srand((unsigned)time(NULL));
	i=rand()%2;
	return i;
}

int main(void)
{
	producer();
    return 0;

	//system("pause");
}

1.程序中consumer和producer是随机进行,机会均等,运用rand()函数进行随机数的创建,来选择是生产者进行还是消费者进行。

2.程序使用kbhit()和system("pause");进行任意键停止程序

存在问题:当按下任意键后只能显示上一步操作后的结果,如上一步操作的是生产者,那么任意键停止后只能显示生产者的信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K-Pioneer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值