ディスラプターに精通している人には以下のコードで十分なので、完全なリストは提供していません。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);
}