为了练习,我试图为读者 - 作家问题写一个解决方案
预期的行为应该是多个读取可以同时运行,但写入需要等待所有读者完成
我的解决方案位于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);
}
}
}
}
}
}
}