2013-03-29 3 views
2

여러 생산자가 단일 소비자에게 메시지를 보내는 생산자 - 소비자 문제의 예가 나타납니다. 일부 메시지가 도착하면 생산자 기아를 피하기 위해 어떤 기술을 권장합니까 "동시에"소비자에게. 지금까지 내가 고려하고 :여러 제조업체, 하나의 소비자 : 기아 없어 짐

  1. 을 (메시지의 다른 번호가 서로 다른 시간 스탬프에 도착하는 것을 어떻게 생각 확실하지) 몇 가지 확률 분포를 샘플링하여 "비 확정적"선택.
  2. 일부 카운터를 사용하여 n 개의 메시지를 보낸 후 잠시 동안 잠자기 상태로 만듭니다.
+0

하드해야합니다 그것은 또한 최소한의 공정성 보장을 제공하지 않습니다. 그게 당신이 사용하는 하나의 문제가 있다면 그냥 버려. –

답변

0

가장 간단한 방법 중 가장 좋은 방법은 메시지를 도착 순서대로 처리하는 것입니다 (간단한 FIFO 목록이 트릭을 수행합니다). 동시에 여러 메시지가 오더라도 상관 없습니다. 이런 식으로 생산자 중 누구도 굶어 죽지 않을 것입니다.

소비자가 메시지를 생산하는 생산자보다 더 빨리 메시지를 소비한다는 것이 한 가지 확실한 사실입니다. 그렇게하지 않으면 소비자를 기다리는 생산자가 끝날 수 있으며 단일 소비자를 위해 여러 생산자를 갖는 것에 어떤 이점도 없습니다.

+0

답장을 보내 주셔서 감사합니다. 불행하게도 그들은 그렇게 할 것입니다. 생산자가 초고속이고 초고속이 천천히 있다고 가정하십시오. 그것은 천천히 절대로 소비 될 기회를 얻지 못할 수도 있습니다. – user1377000

+0

또한 두 번째 접근법을 생각하면 "n"에 이상적인 값을 찾기가 어려울 것입니다. – veda

1

우선 순위 큐를 사용할 수 있다면 각 제작자는 메시지를 보낸 카운터를 가질 수 있다고 생각합니다. 그리고 큐는 messageSent 번호와 날짜에 따라 순서가 정해 지므로 전송 된 번호가 다른 메시지보다 작 으면 다른 메시지보다 먼저 메시지를 보내야합니다. 프로듀서 1 (첫번째) 큐에 5 개 요소를 추가하고 프로듀서 2 일 추가하는 경우 자바에서

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++)); 
    } 
} 

그래서, 큐는 뮤텍스 구현을 상상하기

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

이로 인해 기아가 발생할 수 있습니다. 귀하의 예에서 생산자 1이 요소를 계속 추가하면 생산자 2는 무기한 기아 상태가 될 수 있습니다. 제작자 2는 결코 처리되지 않습니다. – veda

+0

반드시 그렇지는 않습니다. 내가 대답의 맨 아래에 표시 한 내용은 P1 : 1이 처리되고 P2 : 1이면 P1 : 2 바로 뒤에 배치 될 다른 요소를 생산자 2가 넣을 때 1 –

+0

P1이 이전에 요소를 추가하는 경우 어떻게됩니까? P1 : 1. P2가 결코 처리되지 않을 때입니다. – veda

관련 문제