维基百科提供了inadequate implementation经典的生产者 - 消费者问题。在该实现中,消费者实现如下:
procedure consumer()
{
while (true) {
if (itemCount == 0) {
sleep();
}
item = removeItemFromBuffer();
itemCount = itemCount - 1;
if (itemCount == BUFFER_SIZE - 1) {
wakeup(producer);
}
consumeItem(item);
}
}
仅在itemCount == BUFFER_SIZE - 1
时发送对生产者的唤醒呼叫。如果消费者跑得更快(例如连续消费两次),这是否意味着生产者永远不会被唤醒?
答案 0 :(得分:1)
如果您使用多个线程然后是,假设有多个线程,则为此示例设置itemCount == BUFFER_SIZE,然后一旦到达该行
if (itemCount == BUFFER_SIZE - 1)
可以有一个上下文切换到另一个线程,删除另一个项目,因此itemCount等于BUFFER_SIZE - 2,并且只能减少。所以唤醒(生产者)永远不会被召唤。
应该是itemCount< = BUFFER_SZIE-1。