2013-03-29 69 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

相關問題