生产者-消费者问题

———————————————————————————————————————————————

生产者-消费者问题(Producer-Consumer Problem)是信号量应用的一个实例,也可称之为有界缓冲问题。

问题阐述:
2类进程共享1个公共的固定大小的缓冲区,缓冲区包含N个槽。
一类进程是生产者进程,负责将信息放入缓冲区;另一类是消费者进程,从缓冲区中取信息。
———————————————————————————————————————————————
生产者-消费者问题中用到的3个信号量:full、empty、mutex
full:记录缓冲区中非空的槽数,初始值=0
empty:记录缓冲区中空的槽数,初始值=N
mutex:确保进程不同时访问缓冲区,初始值为1,互斥

***生产者-消费者问题***
#define N  100	//缓冲区的槽数
#define TRUE  1
//信号量定义
Semaphore_t 	mutex = 1;
		empty = N;
		full = 0;
//生产者
void producer()
{
	while(TRUE){
		produce();	//生产一项
		P(&empty);	//申请一个空槽
		P(&mutex);	//请求进入临界区
		append();	//加入缓冲区
		V(&mutex);	//离开临界区
		V(&full);	//递增非空槽
	}
}
//消费者	
void consumer()
{
	while(TRUE){
		P(&full);	//申请一个非空槽
		P(&mutex);
		remove();	//从缓冲区移出1项
		V(&mutex); 	//离开临界区
 		V(&empty); 	//递增空槽数
 		consume();	//消费数据

		
	}
}
	   

注意:
每个进程中的多个P操作的出现顺序不能颠倒。通常先执行对资源信号量的P操作,再执行对互斥信号量的P操作,否则可能会引起死锁。在上述问题中,体现为先执行P(&full)/P(&empty),然后再执行P(&mutex)。
P,V操作在很多情况下都是成对出现的。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值