生产者消费者问题(管程实现)

// 管程实现生产者与消费者

#define N 50

// 定义管程
class Monitor{

	// 定义含N个数据的环形缓冲区
	int buffer[N];

	// in表示环形队列队尾指针,out表示环形队列队头指针
	int in, out;

	// notfull表示队列未满的信号量,notempty表示队列非空的信号量
	semaphore notfull;
	semaphore notempty;

	// 缓冲区中数据个数
	int count;

	// 生产者放入数据
	public static void put(int x)
	{
		// 如果队列已满,则需要等待队列空闲才能放入数据
		if(count >= N)
			P(notfull);

		// 放入数据
		// in指向最后一个元素的下一个位置
		buffer[in] = x;
		in = (in + 1) % N;
		count++;
		// 释放队列非空的信号
		V(notempty);

	}

	// 无返回值,所以有形参
	public static void get(int x)
	{
		// 如果队列为空,则需要队列有数据才能取到数据
		if(count <= 0)
			P(notempty);

		// 取出数据
		// out指向队首元素
		x = buffer[out];
		out = (out + 1) % N;
		count--;
		// 释放队列不满的信号
		V(notfull);
	}
}

// 生产者
void producer()
{
	int x;
	while(TRUE)
	{
		/* 准备放入数据 */
		Monitor.put(x);
	}
}

// 消费者
void consumer()
{
	int x;
	/* 准备取数据 */

	Monitor.get(x);


// 主函数
void main()
{
	producer();
	consumer();
	consumer();
}

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值