2012-11-02 38 views
0

我想知道如何解决生产者/消费者问题,但使用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 
    } 
} 

使用那种“伪代码”我想知道,以解决同样的问题(如果最后是OK)2消费者。

+0

第二个函数肯定应该命名为'consumer()'。 –

回答

2

您可以在这两种情况下,小规模使用router pattern

Router http://www.enterpriseintegrationpatterns.com/img/MessageRouter.gif

基本上队列后,你把特殊的人工消费(路由器,只有一个)。如果您有两个竞争消费者,只需将每个收到的消息随机地放入outQueue1outQueue2

如果发生严格交替,路由器会记住上次使用哪个队列并发送给第二个队列。

如果您不想引入额外的步骤,则需要某种同步。在第一种情况下,两个消费者都在争夺他们随机获得的同一把锁。后一种情况更为复杂,需要更高级的同步,这样两个消费者才能被选择性地唤醒。