我想知道如何解决生产者/消费者问题,但使用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名消费者相同的问题(如果最后一次没问题)。
答案 0 :(得分:2)
在这两种情况下,您都可以小规模使用router pattern:
Router http://www.enterpriseintegrationpatterns.com/img/MessageRouter.gif
基本上在队列之后你放置了特殊的人工消费者(路由器,只有一个)。如果您有两个竞争消费者,只需将每个收到的消息随机放入outQueue1
或outQueue2
。
如果严格更改,路由器会记住上次使用的队列并发送到第二个队列。
如果您不想引入额外步骤,则需要某种同步。在第一种情况下,两个消费者都在竞争他们随机获得的锁。后一种情况更复杂,需要更高级的同步,以便两个消费者都被唤醒。