几个生产者,一个消费者:避免饥饿

时间:2013-03-29 17:33:52

标签: multithreading concurrency producer-consumer

给定一个生产者 - 消费者问题的实例,其中几个生产者向单个消费者发送消息:当某些消息到达时,您建议使用哪些技术来避免生产者的饥饿?#34 ;同时"对消费者而言。到现在为止我正在考虑:

  1. 选择"非确定性"通过抽样一些概率分布(不确定如何,考虑到不同数量的消息到达不同的时间戳)。
  2. 使用一些计数器,让生产者在发送n条消息后暂停一段时间。

2 个答案:

答案 0 :(得分: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++));
   }
}

因此,如果Producer 1在队列中添加5个元素(第一个)而Producer 2添加1个,则队列将具有

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

答案 1 :(得分:0)

最简单和最好的方法之一是按照到达顺序处理消息(一个简单的FIFO列表可以解决这个问题)。即使多个消息同时出现也没关系。通过这种方式,没有一个生产者会被饿死。

我要确定的一件事是,消费者比生成消息的制作者更快地消费消息。如果不是,它可能最终会出现在等待消费者的生产者身上,而且单个消费者拥有多个生产者将没有任何优势。