0

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

0 回答 0