并发线程安全列表访问和修改

时间:2013-07-04 23:46:39

标签: c# list thread-safety

我希望能够在多个线程上访问List。这是线程安全的,所以我可以毫无后顾之忧地做到这一点。唯一的问题是偶尔我必须修改List。所以,我想阻止其他线程仅在被修改时使用List

这就是我的想法,有更好的方法吗?

volatile bool isReading = false;
volatile bool isWriting = false;
object o = new object();
public void StartRead()
{
    lock (o)
    {
        while (isWriting || isReading) ;
        isReading = true;
    }
}
public void StopRead()
{
    isReading = false;
}
public void StartWrite()
{
    lock (o)
    {
        while (isReading) ;
        isWriting = true;
    }
}
public void StopWrite()
{
    isWriting = false;
}

1 个答案:

答案 0 :(得分:3)

更好的解决方案是使用ReaderWriterLockSlim。这将允许您同时拥有许多读者,但只有在您有作家时才能锁定它。

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

这实际上取决于锁的争用程度。在低争用情况下,lock的效果与ReaderWriterLockSlim - 参考When is ReaderWriterLockSlim better than a simple lock?类似。

这个问题有很多可能的解决方案,具体取决于有关如何使用它的许多细节。但是,在简单化的“面值”案例中,ReaderWriterLockSlim是一个不错的解决方案。如果在分析性能后它不适合您,则可能需要其他解决方案以适应您的特定使用方案。