互斥2-生产者消费者(原始状态)

一,休眠与唤醒
1,经典的生产者与消费者问题
生产者消费者现象的原型是这样的:
一个生产者生产,当缓冲区满了,就自己休眠
一个消费者消费,当缓冲区空了,就自己休眠

一个生产者生产,当生产一个产品时,就唤醒消费者(可以消费了)
一个消费者消费,当消费一个产品时,就唤醒生产者(可以生产了)

无论是生产者,还是消费着,当被唤醒的时候不一定马上执行,还需要获得cpu

◎这种设计产生了一个问题,原因是需要一个count来记录产品个数,而count的获得并没有互斥
例如如下情况:
消费者取得count=0,但是还没来得及休眠自己的时候,发生了系统进程调度,切换到生产者
生产者生产了一个产品后,唤醒消费者,但是这个时候的消费者并没有休眠,所以唤醒丢失
然后生产者继续生产,直到缓冲满了,自动休眠。
但是这个时候的消费者也是休眠状态,没有人来唤醒他,所以两个都一直休眠下去。

解决方案:
提供一个标志位,当生产者发送唤醒给消费者的时候,记录下来为1,当消费者要休眠之前检查一下这个标志位,如果是1就不休眠,如果不是就休眠
这个方法暂时解决了问题,考虑一下。
如果是m个生产者,n个消费者,m,n又很大的情况下,标志位就太多了。
这种情况下情况下地解决办法见下一篇文章 <互斥3-生产者消费者>

这个方案地实现程序如下:
#define N=100
int count=0;
void product(void){
 int item;
 while(TRUE){
  item=produce_item()
  if(count==N)sleep();
  insert_item(item);
  count=count+1;
  if (count==1)wakeup(consumer);
 }
}
void consumer(void){
 int item;
 while(TRUE){
  if(count==0)sleep();
  item=remove_item();
  count=count-1;
  if(count==N-1)wakeup(product);
  consume_item(item);
 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值