并发中的生产者/消费者问题:生产者生成东西并将它们附加到缓冲区。消费者从缓冲区中获取内容。消费者不想从空缓冲区中获取内容,并且生产者不希望将内容附加到完整缓冲区。
William Stallings的“操作系统”给出了以下用于解决生产者/消费者问题的监视器示例:
// Monitor
append(char x) {
if (count == N) cwait(notfull)
buffer[nextin] = x
nextin = (nextin + 1) % N
count++
csignal(nonempty)
}
take(char x) {
if (count == 0) cwait(notempty)
x = buffer[nextout]
nextout = (nextout + 1) % N
count--
csignal(notfull)
}
// Application using the monitor
producer() {
while (true) {
produce(x)
append(x)
}
}
consumer() {
while (true) {
take(x)
consume(x)
}
}
该书声称“一次只能在监视器中显示一个过程”[p.227]
如何强制执行此属性?
我可以看到这对于1个消费者和1个生产者是如何工作的,但是我没有看到它如何保护 - 例如 - 2个生产者同时写入缓冲区。