Я не привожу полный список, так как приведенного ниже кода достаточно для тех, кто знаком с Disruptor. Вопрос в том, является ли вызов методов Next
и Publish
потокобезопасным. Какой из приведенных ниже примеров будет правильным? Обратите внимание, что Attach
можно вызывать из разных потоков одновременно. И у меня несколько потребителей.
Пример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);
}
ringBuffer
не изменится, пока он заблокирован. - person millimoose   schedule 12.11.2012