.NET 4.0 C#中的并发读者

San*_*eep 2 .net c# concurrency

我在编程竞赛中遇到了这个难题,我不应该使用任何内置的并发.NET 4.0数据结构.

我必须覆盖该ToString()方法,此方法应该支持并发读者.

这是我提出的解决方案,但我坚信它不支持并发读者.如何在不锁定列表的情况下支持并发读者?

class Puzzle
{
    private List<string> listOfStrings = new List<string>();

    public void Add(string item)
    {
        lock (listOfStrings)
        {
            if (item != null)
            {
                listOfStrings.Add(item);
            }
        }
    }

    public override string ToString()
    {
        lock (listOfStrings)
        {
            return string.Join(",", listOfStrings);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*son 8

因为List<T>只是一个T[]引擎盖,所以从多个线程中读取列表并不是什么不安全的事情.你的问题是在同时写作写作时阅读是不安全的.因此,您应该使用ReaderWriterLockSlim.

class Puzzle
{
    private List<string> listOfStrings = new List<string>();
    private ReaderWriterLockSlim listLock = new ReaderWriterLockSlim();

    public void Add(string item)
    {
        listLock.EnterWriteLock();

        try
        {
            listOfStrings.Add(item);
        }
        finally
        {
            listlock.ExitWriteLock();
        }
    }

    public override string ToString()
    {
        listLock.EnterReadLock();

        try
        {
            return string.Join(",", listOfStrings);
        }
        finally
        {
            listLock.ExitReadLock();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ReaderWriterLockSlim将允许多个线程以读取模式进入锁定,但是如果/当某些东西处于写入模式下的锁定状态时它们将全部阻塞.同样,在写入模式下进入锁定将阻塞,直到所有线程都以读取模式退出锁定.实际的外部工作是只要没有写入就可以同时进行多次读取,并且只要没有任何内容正在读取,就可以一次进行一次写入操作.