0

ウィキペディアは、古典的な生産者と消費者の問題の不適切な実装を提供しています。その実装では、コンシューマーは次のように実装されます。

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ます。コンシューマがより速く実行された場合 (たとえば、2 回連続してコンシュームする必要がある場合)、それはプロデューサが起動されないことを意味しますか?

4

1 に答える 1

1

複数のスレッドを使用している場合は、はい。複数のスレッドがある場合、この例では itemCount == BUFFER_SIZE とします。

if (itemCount == BUFFER_SIZE - 1)

別のアイテムを削除する別のスレッドへのコンテキスト スイッチが存在する可能性があるため、itemCount は BUFFER_SIZE - 2 に等しくなり、減少することしかできません。したがって、wakeup(プロデューサー) は呼び出されません。

おそらく itemCount <= BUFFER_SZIE-1 のはずです。

于 2013-04-11T18:24:06.843 に答える