在上一篇博客中记录了如何解决普通生产者消费者的问题,这篇讲一下如何解决多生产者多消费者问题。
多生产者多消费者问题案例:一家四口围着一个盘子,盘子中最多放两个水果。爸爸不断向盘子中投放苹果,儿子不断从盘子中拿走苹果,妈妈不断向盘子中投放橘子,女儿不断从盘子中拿走橘子。
这里需要指明的是,“多生产者多消费者”不是指多个生产者多个消费者,而是指多类生产者多类消费者。
还是一样的思路,分析该问题中存在的同步关系:
1.存放水果的盘子需要互斥访问,这是很明显的。设置一个信号量mutex,初值为1
2.只有当盘子中还有空位时,爸爸妈妈才可以向盘子中投放水果。设置一个信号量empty,初值为2。爸爸妈妈投放水果前对empty执行一次P操作,儿子女儿拿走水果后对empty执行一次V操作。
3.只有当盘子中有苹果时,儿子才可以从盘子中拿苹果。设置一个信号量apple,初值为0。儿子取出苹果之前对apple执行一次P操作,爸爸投放水果之后对apple执行一次V操作。
4.只有当盘子中有橘子时,女儿才可以从盘子中拿橘子。设置一个信号量orange,初值为0。与apple同理。
下面分别是父亲、母亲、儿子、女儿线程的伪代码:
Semaphore mutex = 0;
Semaphore empty = 2;
Semaphore apple = 0;
Semaphore orange = 0;
void father(){
while (true) {
P(empty);
P(mutex);
V(mutex);
V(apple);
}
}
void mother(){
while (true) {
P(empty);
P(mutex);
V(mutex);
V(orange);
}
}
void son(){
while (true) {
P(apple);
P(mutex);
V(mutex);
V(empty);
}
}
void daughter(){
while (true) {
P(orange);
P(mutex);
V(mutex);
V(empty);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)