1

我想要做的是List在多个线程上访问 a 。这是线程安全的,所以我可以毫无顾虑地做到这一点。唯一的问题是偶尔,我必须修改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;
}
4

1 回答 1

3

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

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

不过,这实际上取决于锁的竞争程度。在低争用情况下,alock将执行类似于ReaderWriterLockSlim- 参考ReaderWriterLockSlim 何时比简单锁更好?.

这个问题有很多可能的解决方案,具体取决于有关如何使用它的许多细节。但是,在简单的“表面价值”的情况下,aReaderWriterLockSlim是一个不错的解决方案。如果在分析性能后它对您不起作用,则可能需要其他解决方案来适应您的特定使用场景。

于 2013-07-04T23:51:18.003 回答