操作系统中关于生产者消费者问题

m个消费者,r个消费者和n个缓冲器

分析:现在是m个生产者在生产了产品向缓冲器存放时,由于只有一个指示位置的共享变量k,所以那些所有的生产者需要互斥访问共享变量k,即同一时刻只能有一个访问,同理消费者共享了指示位置的t,所有消费者也要互斥访问共享变量t,显然生产者需要一个一个的去缓冲器中存放物品,而消费者需要一个一个的到缓冲器中存放物品,但现在有两种解法的点在于:是可以生产者和消费者只能有一个在缓冲器中,还是即使生产者在缓冲器中,消费者也可以进来取东西。


现在我们先来说第一个程序(生产者和消费者同一时刻只能有一个在缓冲器中)


首先我们还要以前讲过的sp = n(用于计数可用资源数(空的缓冲器)),sc = 0(用于记录满的缓冲器)两个信号互斥量,还需要增加一个互斥信号量s = 1(用于生产者和消费者之间互斥访问缓冲器)


[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int buffer[n],k = 0,t = 0;  
  2. semaphore sp = n,sc = 0s = 1;  
  3.   
  4. process produceri(void)  (i = 1,2,3...m)  
  5. {  
  6.     while(1)  
  7.     {  
  8.         {生产一个产品product};  
  9.          p(sp);  
  10.          p(s);  
  11.          buffer[k] = product;  
  12.          k = (++k)%n;  
  13.          v(s);  
  14.          v(sc);  
  15.     }  
  16. }  

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. process consumerj(void)  (j = 1,2,3....r)  
  2. {  
  3.     while(1)  
  4.     {  
  5.         p(sc);  
  6.         {取走缓冲器buffe[t]中的产品};  
  7.         t = (++t)%n;  
  8.         v(sp);  
  9.         v(s);  
  10.         {消费该产品};  
  11.     }  
  12. }  

(2)就是上面所说的在生产者在缓冲器里面房放产品时,消费者也能进去取产品。

其实修改很简单,上面程序不是设置一个信号量让s = 1,不管是消费者还是生产者都只能一个人访问共享变量,现在只要在生产者里面设立一个互斥访问量s1 = 1,然后在消费者里面在设立一个互斥访问量s2 = 1,就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值