2013-03-29 33 views
2

考虑到生产者 - 消费者问题的一个实例,其中多个生产者向单个消费者发送消息:当消息的一些到达时,您推荐什么技术来避免生产者饿死“同时”给消费者。直到现在我正在考虑:几个生产者,一个消费者:避免饥饿

  1. 通过抽样一些概率分布(不知道如何,考虑到不同数量的消息到达不同的时间戳),选择“非确定性”。
  2. 使用一些计数器,并让制片人在发送n条消息后睡一会儿。
+0

很难想象你有一个互斥实现这也没有提供最低程度的公平保证。如果这是你使用的问题,那就把它扔掉。 –

回答

0

最简单也是最好的方法之一是按照它们到达的顺序处理消息(一个简单的FIFO列表可以做到这一点)。即使多条消息同时发送也没关系。通过这种方式,没有一个生产者会饿死。

我会确定的一件事是消费者比生产消息的消费者更快地消费消息。如果不是这样,它可能最终会在生产者等待消费者,并且在为单个消费者提供多个生产者方面没有任何优势。

+0

感谢您的回复。不幸的是他们会。考虑一个制片人超级快,另一个超级慢。它应该是慢速永远不会有机会被消耗。 – user1377000

+0

另外,想想你的第二种方法,我想这将很难找到理想的值为“n” – veda

1

如果你可以有一个优先级队列,我认为每一个生产者可以有一个消息发送计数器。队列将根据messageSent号码和日期进行排序,这样,如果发送的号码小于另一个邮件,则应该在另一个邮件之前发送邮件。

在Java

class Message { //or you can implement Comparable<Message> 
    final Date created = new Date(); 
    final int messageNumber; 
    public Message(int m){this.messageNumber = m;} 
} 
BlockingQueue<Message> queue = new PriorityBlockingQueue<Message>(new Comparator(){ 
    public int compare(Message m1, Message m2){ 
     if(m1.messageNumber < m2.messageNumber) return 1; 
     if(m2.messageNumber < m1.messageNumber) return -1; 
     if(m1.messageNumber == m2.messageNumber) return m1.created.compareTo(m2.created); 
    } 
}); 
class Provider{ 
    int currentMessage = 0; 
    void send(){ 
     queue.offer(new Message(currentMessage++)); 
    } 
} 

因此,如果生产者增加1 5种元素的队列(第一)和制片人2加1,队列将有

P1: 5 
P1: 4 
P1: 3 
P1: 2 
P2: 1 
P1: 1 
+0

这可能会导致饥饿。在你的例子中,如果生产者1继续添加元素,那么生产者2可能陷入无限期的饥饿。制片人2永远不会得到处理。 – veda

+0

不一定。我表明我的回答底部表明,P1:1将得到处理,然后P2:1,如果生成器2把在队列中的另一元素,它将正确的P1之后放置:2 –

+0

如果P1不断前添加元素会发生什么P1:1.那时P2永远不会被处理 – veda

相关问题