【发布时间】:2018-11-11 02:05:44
【问题描述】:
Producer Consumer 的标准实现方式如下:
-
useQueue互斥体 -
emptyCount大小的信号量N -
fullCount大小的信号量N
制作:
down(emptyCount)
down(useQueue)
putItemIntoQueue(item)
up(useQueue)
up(fullCount)
消费:
down(fullCount)
down(useQueue)
item ← getItemFromQueue()
up(useQueue)
up(emptyCount)
如果down 具有非正值,则线程等待。
up 增加计数
取自this维基百科文章
为什么我们不能有类似的东西:
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)
为什么我们需要两个不同的变量emptyCount 和fullCount?
【问题讨论】:
-
Wjat 是否“同步”,因为您似乎在里面等待?
-
这是Java提供的监视器。用于对信号量对象进行原子语句
标签: operating-system synchronization mutex semaphore producer-consumer