2012-11-12 1 views
2

아래 코드는 방해 요소가있는 사람들에게 충분하기 때문에 전체 목록을 제공하지 않습니다. NextPublish 메서드를 호출하면 스레드로부터 안전할까요? 아래의 예들 사이에 올바른 것이 무엇일까? Attach은 다른 스레드에서 동시에 호출 할 수 있습니다. 그리고 나는 여러 소비자가있다.Disruptor Next/Publish 메소드에 대한 액세스를 동기화해야합니까?

실시 예 1. 모든 것을 잠그십시오 :

private object attachLock = new object(); 

    // can be called from parallel threads 
    public void Attach(OrdersExecutor oe) 
    { 
     lock (attachLock) 
     { 
      long sequenceNo = ringBuffer.Next(); 
      ringBuffer[sequenceNo].Value = oe; 
      ringBuffer.Publish(sequenceNo); 
     } 
    } 

예 2. 다음 잠금 :

private object attachLock = new object(); 

    // can be called from parallel threads 
    public void Attach(OrdersExecutor oe) 
    { 
     long sequenceNo; 
     lock (attachLock) 
     { 
      sequenceNo = ringBuffer.Next(); 
     } 
     ringBuffer[sequenceNo].Value = oe; 
     ringBuffer.Publish(sequenceNo); 
    } 

예 3. 없음 잠금

후드에서
private object attachLock = new object(); 

    // can be called from parallel threads 
    public void Attach(OrdersExecutor oe) 
    { 
     long sequenceNo = ringBuffer.Next(); 
     ringBuffer[sequenceNo].Value = oe; 
     ringBuffer.Publish(sequenceNo); 
    } 
+0

메소드 자체가 스레드 세이프 인 경우에도 예제 1의 의미는 2와 3이 다릅니다. 예제 1에서는 'ringBuffer'의 내용이 변경되지 않는다고 (동기화가 올바른 경우) 보장됩니다. 잠겨있어. – millimoose

+0

Disruptor 코드를 간단히 살펴보면 스레드로부터 안전함을 알 수 있습니다. 이러한 메소드의 구현은 비공개 동시 수집에 사용되는 다양한 기술을 사용하는 것으로 보입니다 (개인 메소드 이름으로 진행). – millimoose

답변

4

나는 disruptor-net의 저자입니다.

disruptor는 동시 수집이므로 한 번 제대로 구성하면 잠금을 적용 할 필요가 없습니다. 여러 개의 생성자가 있으므로 예제 3을 사용하여 링 버퍼에 게시하므로 RingBuffer를 MultiThreadedClaimStrategy로 초기화해야합니다.

그런데, 생산 코드에서 disruptor-net의 사용을 권장하지 않으며, 여유 시간에 얼마 전 포팅하고 프로덕션 코드에서 사용하지 않았으므로 추가 테스트가 필요합니다.

.NET 동시 대기열이 Java 대기열보다 훨씬 빠르기 때문에 ConcurrencyQueue를 Disrutpor 또는 Disruptor에 매우 가까운 의미를 제공하는 BlockingCollection 대신 사용할 것을 제안합니다.

+0

여기에서 당신을 만나서 기뻐하고 응답 해 주셔서 감사합니다! 나는 BlockingCollection 대 ​​Disruptor-net 및 BlockingCollection을 테스트 한 결과 테스트가 훨씬 느리다. http://stackoverflow.com/questions/13334778/why-my-disruptor-example-is-so-slow 내 응용 프로그램에서 Disruptor로 BlockingCollection을 대체하면 어떻게 든 BlockinCollection보다 느리게 작동합니다. 하지만 MultiThreadedClaimStrategy를 사용하지 않고 대신 http://stackoverflow.com/a/13339465/93647과 같은 것을 사용합니다. BlockingCollection과 disruptor를 비교하기 위해 또 하나의 독립 실행 형 테스트를 만들 계획입니다. – javapowered

1

Next()Publish()의 구현은 Interlocked 정적 클래스를 기반으로하지 않습니다. 그래서 코드는 으로 설계되어 스레드 안전성을 보장합니다. 쓰래드 안전하고 지진처럼 보입니다. 하지만 스레드 안전합니까? 나는 모른다.

이 프로젝트는 매우 활발한 것처럼 보이지 않으며 자바 API에 뒤처져 있지 않습니다. 일부 테스트는 실패하고 (Mono) 일부 기능은 전혀 테스트되지 않습니다 (WorkerPool). 조심해서 사용하십시오.

나는 그를 초청 한 저자에게 편지를 보내 왔으며, 그의 설명을 기다리 자.