c# - .NET 4.0 C# 中的并发读者

标签 c# .net 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);
        }
    }
}

最佳答案

因为 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();
        }
    }
}

ReaderWriterLockSlim将允许多个线程在读取模式下进入锁定,但如果/当某些东西在写入模式下处于锁定状态时,它们将全部阻塞。同样,以写模式进入锁将阻塞,直到所有线程以读模式退出锁。实际结果是,只要没有写入,就可以同时发生多个读取,只要没有读取,就可以一次发生一个写入操作。

关于c# - .NET 4.0 C# 中的并发读者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8102440/

相关文章:

java - java中的异步处理

c# - 构建项目时看不到错误消息

C# 将 IntPtr 转换为 int

c# - 关键字 "auto"C++ 和 "dynamic"C#

.net - 需要一个正则表达式模式来匹配

.NET:如何配置我自己的范围服务之一以静态访问?

C pthreads 分部分运行

c# - .NET 中的 Erlang 风格的轻量级进程

c# - 将自己的字形添加到 uwp 项目

.net - 使用在 "with" block 内分配的实例的成员会抛出 System.NullReferenceException