まず、この MSDN の記事が役立つかもしれません。Jeffrey Richter が語っているライブラリは、こちらから入手できます。
アプリケーションは .Net 2.0 で開発されているため、リーダーよりもライターを優先するカスタム ReaderWriterLock を使用することをお勧めします。また、ソースコードを探しているなら、この人が助けになるかもしれません。カスタム ReaderWriterLock の 1 つで、彼は次のように書いています。
public sealed class ReaderWriterLock
{
int readers = 0;
int writers = 0;
public void AcquireReaderLock()
{
Thread.BeginCriticalRegion();
while (true)
{
if (Thread.VolatileRead(ref writers) == 0)
{
Interlocked.Increment(ref readers);
if (Thread.VolatileRead(ref writers) == 0)
{
return;
}
else
{
Interlocked.Decrement(ref readers);
}
}
Thread.Sleep(1);
}
}
public void ReleaseReaderLock()
{
Interlocked.Decrement(ref readers);
Thread.EndCriticalRegion();
}
public void AcquireWriterLock()
{
Thread.BeginCriticalRegion();
while (Interlocked.CompareExchange(ref writers, 1, 0) != 0)
{
Thread.Sleep(1);
}
while (Thread.VolatileRead(ref readers) != 0)
{
Thread.Sleep(1);
}
}
public void ReleaseWriterLock()
{
Thread.VolatileWrite(ref writers, 0);
Thread.EndCriticalRegion();
}
}
キーポイント:
- 読者よりも作家を好む
- 先着順
- スピンロックが使用されているため、短いロック期間のみに最適です