为什么在生产者-消费者问题中,信号量需要两个变量



生产者-消费者的标准实现方式如下:

  • useQueue互斥
  • N大小的emptyCount信号量
  • 尺寸为NfullCount信号量

生产:

down(emptyCount)
down(useQueue)
putItemIntoQueue(item)
up(useQueue)
up(fullCount)

消耗:

down(fullCount)
down(useQueue)
item ← getItemFromQueue()
up(useQueue)
up(emptyCount)

其中,如果down具有非正值,则线程等待。up向上推计数

摘自维基百科文章

为什么我们不能有这样的东西:

class NewSemaphore {
int capacity, permits;
/**
* Initialize the semaphore with a max capacity
* @param n the max capacity
*/
NewSemaphore(int n) {
capacity = n;
permits = 0;
}
/**
* We usually never check this. Check if it's within limits.
* If not, wait
*/
synchronized void up() {
if (permits >= capacity) {
wait();
} else {
permits++;
notify();
}
}
/**
* Standard down/acquire function
*/
synchronized void down() {
if (permits <= 0) {
wait();
} else {
permits--;
notify();
}
}
}

这将被称为:

生产:

up(mySemaphore)
down(useQueue)
putItemIntoQueue(item)
up(useQueue)

消耗:

down(mySemaphore)
down(useQueue)
item ← getItemFromQueue()
up(useQueue)

为什么我们需要两个不同的变量emptyCountfullCount

不,两个信号量并不是真正必要的,这里有一个用C编写的单个信号量解决方案,请在这里查看:https://github.com/heguihua/unisem

有两个信号量,因为我们要检查两件事。首先,如果没有什么可消费的,消费者会等待;其次,如果队列已满,生产者会等待。

你的想法是让生产者继续生产,直到他们耗尽内存或其他资源。

最新更新