.NET ReaderWriterLockSlim问题

Kam*_*rey 7 .net multithreading thread-safety

有很多关于ReaderWriterLockSlim类的文章,它允许多次读取和单次写入.所有这些(至少我发现的)告诉如何使用它而没有太多解释为什么以及如何工作.标准代码示例是:

lock.EnterUpgradeableReadLock();

try
{
   if (test if write is required)
   {
      lock.EnterWriteLock();

      try
      {
          change the resourse here.
      }
      finally
      {
         lock.ExitWriteLock();
      }
   }
}
finally
{
   lock.ExitUpgradeableReadLock();
}
Run Code Online (Sandbox Code Playgroud)

问题是:如果可升级锁只允许一个线程进入其部分,为什么我应该在其中调用EnterWriteLock方法?如果我不这样做会怎样?或者如果不是使用EnterUpgradeableReadLock,我会调用EnterWriteLock并且在不使用可升级锁的情况下写入资源会发生什么?

Fre*_*örk 10

使用EnterUpgradeableReadLock结束的好处EnterReadLock是,您可以确定在检查条件和实际进入写锁定之间检查以确定是否进入写锁定的条件不会发生变化.这避免了常规locks 可能需要的重复:

if (whatever-condition)
{
    lock (_lockObject)
    {
        // the condition may have changed betwen the check and the lock; verify
        // that the condition is still valid
        if (whatever-condition)
        {
            // do the stuff
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

与此同时,它并不能阻止对电话EnterReadLock,所以其他线程可能仍然获得阅读的代码的其他部分的访问(以及那些电话,当然,阻塞调用EnterWriteLock,直到他们释放读锁).