消费者加快了对经典生产者消费者的不充分实施

时间:2013-04-11 18:08:21

标签: multithreading synchronous producer-consumer

维基百科提供了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时发送对生产者的唤醒呼叫。如果消费者跑得更快(例如连续消费两次),这是否意味着生产者永远不会被唤醒?

1 个答案:

答案 0 :(得分:1)

如果您使用多个线程然后是,假设有多个线程,则为此示例设置itemCount == BUFFER_SIZE,然后一旦到达该行

if (itemCount == BUFFER_SIZE - 1)

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

应该是itemCount< = BUFFER_SZIE-1。