1

生産者/消費者問題を解決する方法を知りたいのですが、2つの異なる消費者を使用しており、厳密な交互を使用して解決する方法も知る必要があります。

1つのプロデューサーと1つのコンシューマーに対して次のアルゴリズムを作成しました

producer()
{
   while(true)
   {
       if i == N //full buffer
          turn = 1
       while turn <> 0
       {
           // nothing
       }
       produceitem(&item)//produce the item
       insertitem(item, buffer)//insert the item in the buffer
       turn = 1
       //process zone
   }
}

consumer()
{
   while(true)
   {
       if i == 0 //empty buffer
          turn = 0
       while turn <> 1
       {
           // nothing
       }
       consumeitem(&item)
       deleteitem(buffer)//erase the item from buffer
       turn = 0
       //process zone
   }
}

そのような「擬似コード」を使用して、2人の消費者で同じ問題(最後がOKの場合)を解決するために知りたいです。

4

1 に答える 1

2

どちらの場合も小規模でルーターパターンを使用できます。

ルーター
(出典:enterpriseintegrationpatterns.com

基本的に、キューの後に特別な人工消費者 (ルーター、1 つだけ) を配置します。競合するコンシューマーが 2 つある場合は、受信した各メッセージをランダムにoutQueue1またはのいずれかに配置しますoutQueue2

厳密な交代の場合、ルーターは前回使用されたキューを記憶し、2 番目のキューに送信します。

余分なステップを導入したくない場合は、何らかの同期が必要です。最初のケースでは、両方の消費者がランダムに取得した同じロックをめぐって競合しています。後者の場合はより複雑で、両方のコンシューマが交互に起動されるように、より高度な同期が必要になります。

于 2012-11-02T14:09:36.233 に答える