.NET中的线程同步

Ran*_*der 2 c# multithreading locking

在我的应用程序中,我有一个对象列表.我将每隔几分钟运行一个进程(线程)来更新此列表中的值.我将有其他进程(其他线程)只读取这些数据,他们可能会同时尝试这样做.

当列表更新时,我不希望任何其他进程能够读取数据.但是,我不希望在没有更新时,只读进程会相互阻塞.最后,如果进程正在读取数据,则更新数据的进程必须等到读取数据的进程完成.

我应该实现什么样的锁定来实现这一目标?

Mar*_*uła 5

就是你要找的东西.

ReaderWriterLockSlim是一个将处理您要求的场景的类.您可以使用2对功能:

  • EnterWriteLockExitWriteLock
  • EnterReadLockExitReadLock

第一个将等待,直到所有其他锁都关闭,读取和写入,所以它会像你一样给你访问lock().

第二个是相互兼容的,你可以在任何给定的时间有多个读锁.

因为没有像lock()语句一样的语法糖,所以请确保你永远不会忘记退出锁定,因为Exception或其他任何东西.所以在这样的形式使用它:

try
{
lock.EnterWriteLock(); //ReadLock

//Your code here, which can possibly throw an exception.

}
finally
{
lock.ExitWriteLock(); //ReadLock
}