操作系统中关于生产者消费者问题
2016-10-13 19:46
387 查看
m个消费者,r个消费者和n个缓冲器
分析:现在是m个生产者在生产了产品向缓冲器存放时,由于只有一个指示位置的共享变量k,所以那些所有的生产者需要互斥访问共享变量k,即同一时刻只能有一个访问,同理消费者共享了指示位置的t,所有消费者也要互斥访问共享变量t,显然生产者需要一个一个的去缓冲器中存放物品,而消费者需要一个一个的到缓冲器中存放物品,但现在有两种解法的点在于:是可以生产者和消费者只能有一个在缓冲器中,还是即使生产者在缓冲器中,消费者也可以进来取东西。
现在我们先来说第一个程序(生产者和消费者同一时刻只能有一个在缓冲器中)
首先我们还要以前讲过的sp = n(用于计数可用资源数(空的缓冲器)),sc = 0(用于记录满的缓冲器)两个信号互斥量,还需要增加一个互斥信号量s = 1(用于生产者和消费者之间互斥访问缓冲器)
[html] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
int buffer
,k = 0,t = 0;
semaphore sp = n,sc = 0, s = 1;
process produceri(void) (i = 1,2,3...m)
{
while(1)
{
{生产一个产品product};
p(sp);
p(s);
buffer[k] = product;
k = (++k)%n;
v(s);
v(sc);
}
}
[html] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
process consumerj(void) (j = 1,2,3....r)
{
while(1)
{
p(sc);
{取走缓冲器buffe[t]中的产品};
t = (++t)%n;
v(sp);
v(s);
{消费该产品};
}
}
(2)就是上面所说的在生产者在缓冲器里面房放产品时,消费者也能进去取产品。
其实修改很简单,上面程序不是设置一个信号量让s = 1,不管是消费者还是生产者都只能一个人访问共享变量,现在只要在生产者里面设立一个互斥访问量s1 = 1,然后在消费者里面在设立一个互斥访问量s2 = 1,就行了。
分析:现在是m个生产者在生产了产品向缓冲器存放时,由于只有一个指示位置的共享变量k,所以那些所有的生产者需要互斥访问共享变量k,即同一时刻只能有一个访问,同理消费者共享了指示位置的t,所有消费者也要互斥访问共享变量t,显然生产者需要一个一个的去缓冲器中存放物品,而消费者需要一个一个的到缓冲器中存放物品,但现在有两种解法的点在于:是可以生产者和消费者只能有一个在缓冲器中,还是即使生产者在缓冲器中,消费者也可以进来取东西。
现在我们先来说第一个程序(生产者和消费者同一时刻只能有一个在缓冲器中)
首先我们还要以前讲过的sp = n(用于计数可用资源数(空的缓冲器)),sc = 0(用于记录满的缓冲器)两个信号互斥量,还需要增加一个互斥信号量s = 1(用于生产者和消费者之间互斥访问缓冲器)
[html] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
int buffer
,k = 0,t = 0;
semaphore sp = n,sc = 0, s = 1;
process produceri(void) (i = 1,2,3...m)
{
while(1)
{
{生产一个产品product};
p(sp);
p(s);
buffer[k] = product;
k = (++k)%n;
v(s);
v(sc);
}
}
[html] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
process consumerj(void) (j = 1,2,3....r)
{
while(1)
{
p(sc);
{取走缓冲器buffe[t]中的产品};
t = (++t)%n;
v(sp);
v(s);
{消费该产品};
}
}
(2)就是上面所说的在生产者在缓冲器里面房放产品时,消费者也能进去取产品。
其实修改很简单,上面程序不是设置一个信号量让s = 1,不管是消费者还是生产者都只能一个人访问共享变量,现在只要在生产者里面设立一个互斥访问量s1 = 1,然后在消费者里面在设立一个互斥访问量s2 = 1,就行了。
相关文章推荐
- 关于生产者-消费者问题的一些思考
- 关于网宿厦门研发中心笔试的一道PV操作题:利用java中的多线程实现生产者与消费者的同步问题
- 操作系统 生产者消费者问题
- 【操作系统总结】经典的进程同步问题-生产者消费者问题
- 【操作系统】生产者消费者问题分析(线程同步)
- 黑马程序员-关于生产者消费者和火车票出售的线程问题
- 关于生产者-消费者问题
- 关于多线程的经典问题——生产者消费者,不能实现循环工作。
- 关于生产者-消费者问题
- 关于 生产者与 消费者问题 代码 ++ 注释
- 关于线程生产者和消费者的问题
- 操作系统里的生产者、消费者问题
- 关于java用阻塞队列解决生产者消费者问题总结
- 2015年考研核心考点命题思路解密——操作系统 第2章 进程管理 PV算法 文件打印问题 生产者——消费者问题
- Linux下生产者消费者问题详细分析(操作系统期中考试论文---并发程序的同步和互斥)
- 操作系统进程同步三大问题:生产者消费者,哲学家进餐,读者写者问题
- 操作系统同步生产者消费者问题
- 【操作系统】经典教程同步问题 ---- 生产者和消费者
- 关于生产者-消费者问题
- 操作系统经典同步互斥问题——生产者消费者问题