2013-06-26 2 views
1

나는 여러 생산자와 단일 소비자가있는 상황이 있습니다. 성능상의 이유로 소비자가 어떤 종류의 차단도하고 싶지는 않지만 더 많은 생산자가있을 수 있기 때문에 대기열이 가득 차면 "차단"해야합니다.생산자 소비자 차단 대기열

이러한 동작을 제공하는 큐가 있습니까? 아니면 내 필요에 맞게 ArrayBlockingQueue를 수정할 수 있습니까?

+0

에 대한 ArrayBlockingQueue.put을 차단'ArrayBlockingQueue' 당신이 할 수있는 확장하고 그 기능을 무시, 최종되지 않습니다. –

답변

0

BlockingQueue 구현의 문제점은 무엇입니까? 소비자는 비 블로킹 인 peek() poll()으로 전화를 걸 수 있으며 생산자는 대기열이 가득 차면 put(E e)을 차단할 수 있습니다. 큐가 믿을 수 없을만큼 집중적 인 작업에 사용되는 경우

UPDATE

LMAX's disruptor ring buffer 가장 성능이 좋은 큐잉 구조 될 가능성이 높습니다.

+0

이 잠금 작동 방식을 수정해야합니다. 나는 개념을 정확하게 이해하지 못할 수도 있습니다. 생산자가 획득 한 잠금이 있고 "대기"상태가되면 ... 소비자는 일부 요소를 가져오고 대기열에 "잠금"을 수행하려고합니다. 생산자가 자물쇠를 잡고 있지 않습니까? – hpet

+0

소비자 스레드가'poll()'을 호출하는 동안 컨텍스트 전환을 할 수 있고 다른 소비자를 차단하면서 잠금을 유지할 가능성이 있지만, 수명이 짧을 수 있습니다 (작은) 가능성이 있습니다. * 중요하지 않은 경우 (초당 수십만 대기열 액세스) 순차적으로 문제가 발생할 것으로 기대하지는 않습니다. 집중적 인 일을하고 있다면, LMAX의 방해물을 살펴보십시오. http://lmax-exchange.github.io/disruptor/ – SimonC

2

을 사용하여 소비자에 대한 ArrayBlockingQueue.poll 비 차단하고 생산자

+0

정확하게 이해하지 못할 수도 있고, 자기 자신을 나쁘게 표현했을 수도 있습니다. ArrayBlockingQeueu의 소스 코드 인 poll은 여전히 ​​잠금을 획득하고 있습니다. 즉, 다른 잠금이있을 경우 대기 상태가되어 차례를 얻습니다. 나는 소비자가 잠금에 아무렇게나 관여하는 것을 원하지 않습니다. 주어진 색인을 잡고 제작자에게 알리십시오. 나는 이미 설문 조사를 통해 이러한 구현을하고 있지만 생산자 풀 (대기열 길이와 같음)이 경쟁하고 기다리고 있기 때문에 (소비자가 가정하는) 소비자가 어떻게 든 "굶주린"것처럼 보입니다. – hpet

+0

글쎄, 당신은 블로킹과 폴링을 결코 원하지 않는다고 말했다. 잠금에 관해서는, 잠금/블로킹 BlockingQueue를 기다릴 필요가 없기 때문에 Locking free BlockingQueue를 만들 수 없습니다. –