生产者消费者问题

问题描述:设有n个缓冲区,一组生产者进程往缓冲区写数据,一组消费者进程从缓冲区取数据,写取以一个缓冲区为单位。

说明:

      将缓冲池看作是共享数据,对缓冲区的操作必须是互斥操作。
      如果n个缓冲区全满,生产者进程必须等待。
      如果缓冲区全空,消费者进程必须等待。
设置以下信号量
   互斥: mutex,初值为1,控制互斥访问缓冲池。
   同步: full,初值为0,表示当前缓冲池中满缓冲区数。
              empty,初值为N,表示当前缓冲池中空缓冲区数。
有限缓冲区问题解决:
main(){
int mutex=1;
int empty=n;
int full=0;
Cobegin
P1();
p2();
Coend
}
生产者与消费者的同步关系:
生产者:当有界缓冲区中无空位置时,要等待;

              向有界缓冲区放入物品后,要发消息;
消费者:当有界缓冲区中无物品时,要等待;
              从有界缓冲区取出物品后,要发消息;
//进程P1:
p1()
{
         while(生产未完成)
         {
            ...
            p(empty);
            p(mutex);
            送一个产品到有界缓冲区:
            v(mutex);
            v(full);
            }
}

//进程P2:
P2()
{
        while(还要继续消费)
        {
            p(full);
            p(mutex);
            从有界缓冲区中取产品:
            v(empty);
            v(mutex);
            消费一个产品:
            ...
          }
}

           特别注意,无论是在消费者还是生产者进程中,V操作的次序无关紧要,但两个P操作的次序却不能颠倒,否则可能导致死锁:empty为0,full为n时,易发生死锁:生产者见到mutex为绿灯后进入,将mutex置为红灯;此时empty为0,则等待,这时消费者无法进入消费(mutex为红灯)。                     

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值