我在一次编程竞赛中遇到了这个难题,我不应该使用任何内置的并发 .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/