0

Wikipedia对经典的生产者-消费者问题的实现并不充分。在该实现中,消费者实现如下:

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. 如果消费者跑得更快(例如连续消费两次),这是否意味着生产者永远不会被唤醒?

4

1 回答 1

1

如果您使用多个线程,那么是的,假设 itemCount == BUFFER_SIZE 对于这个例子如果有多个线程,那么一旦你到达该行

if (itemCount == BUFFER_SIZE - 1)

可以有一个上下文切换到另一个删除另一个项目的线程,因此 itemCount 等于 BUFFER_SIZE - 2,并且只能减少。所以唤醒(生产者)永远不会被调用。

它可能应该是 itemCount <= BUFFER_SZIE-1。

于 2013-04-11T18:24:06.843 回答