为了练习,我正在尝试为读者-作者问题写一个解决方案。
预期的行为应该是多个读取可以同时运行,但写入需要等待所有读取器完成。
我的解决方案如下Read()
,Write()
方法和我所参考的书Write2()
为作者提供了建议。
1)我不完全理解他们为什么选择以这种方式实现,特别是为什么读锁在 numOfReaders == 0 时被唤醒后试图再次获取。这是为了给读者优先权,如果在 Write 之后立即出现获得了读锁,就在它真正写任何东西之前?
2)我建议的 Write 实现还有其他问题吗?谢谢!!
class ReaderWriter
{
private int numOfReaders = 0;
private readonly object readLock = new object();
private readonly object writeLock = new object();
public void Read()
{
lock (readLock)
{
this.numOfReaders++;
}
// Read stuff
lock (readLock)
{
this.numOfReaders--;
Monitor.Pulse(readLock);
}
}
// My solution
public void Write()
{
lock (writeLock)
{
lock (readLock)
{
while (this.numOfReaders > 0)
{
Monitor.Wait(readLock);
}
// Write stuff
}
}
}
// Alternative solution
public void Write2()
{
lock (writeLock)
{
bool done = false;
while (!done)
{
lock (readLock)
{
if (this.numOfReaders == 0)
{
// Write stuff
done = true;
}
else
{
while (this.numOfReaders > 0)
{
Monitor.Wait(readLock);
}
}
}
}
}
}
}