Reader-Writer锁实现

时间:2017-10-16 02:02:05

标签: c# multithreading concurrency readerwriterlock

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

0 个答案:

没有答案