아래 코드는 방해 요소가있는 사람들에게 충분하기 때문에 전체 목록을 제공하지 않습니다. Next
및 Publish
메서드를 호출하면 스레드로부터 안전할까요? 아래의 예들 사이에 올바른 것이 무엇일까? 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);
}
메소드 자체가 스레드 세이프 인 경우에도 예제 1의 의미는 2와 3이 다릅니다. 예제 1에서는 'ringBuffer'의 내용이 변경되지 않는다고 (동기화가 올바른 경우) 보장됩니다. 잠겨있어. – millimoose
Disruptor 코드를 간단히 살펴보면 스레드로부터 안전함을 알 수 있습니다. 이러한 메소드의 구현은 비공개 동시 수집에 사용되는 다양한 기술을 사용하는 것으로 보입니다 (개인 메소드 이름으로 진행). – millimoose