ReaderWriterLock如何在线程之间共享?它是用单例实现的吗?

时间:2011-04-20 06:42:26

标签: .net readerwriterlock

如果您想使用ReaderWriterLock,请将其声明为:

ReaderWriterLock rwLock = new ReaderWriterLock;

如果您正在为要访问某些要保护的资源的不同线程执行此操作,那么(可能)它们都使用不同的ReaderWriterLock实例。

如何在线程之间共享ReaderWriterLock实例?

另外,作为奖励,有人可以向我确认您真正“锁定”的内容是ReaderWriterLock状态,而不是任何资源。与lock(someResourceToLock)不同,除了ReaderWriterLock实例的状态(无论是处于读取还是写入模式,以及是否允许您进行读写),您都不会锁定任何内容。

2 个答案:

答案 0 :(得分:2)

如果您使用ReaderWriterLock rwLock = new ReaderWriterLock 每个帖子每个方法(即作为方法变量),那么您的代码最有可能被破坏。它不是单身人士;它依赖于使用相同锁访问受保护数据的所有线程。这通常是通过将锁放在一个字段中来实现的,即

class Foo {
    ReaderWriterLock rwLock = new ReaderWriterLock();
    // lots of code accessing the rwLock field for this instance
}

另外 - 在许多场景中可能会考虑ReaderWriterLockSlim;减少开销。你的后续行动;获取锁时,您正在更改内部状态(以线程安全的方式)以保留“多读者nand单一作者”期望(可能阻塞,直到可能,即冲突的锁已被撤销)

答案 1 :(得分:2)

  

如何在线程之间共享ReaderWriterLock实例?

创建ReaderWriterLock实例,并在访问您要保护的共享资源的所有线程中使用它。

  

另外,作为奖励,有人可以向我确认你真正“锁定”的是ReaderWriterLock状态,而不是任何资源。与lock(someResourceToLock)不同,除了ReaderWriterLock实例的状态之外你没有锁定任何东西

你真的在锁定。

lock(obj) { ... }只是一个捷径(在这里简化,真正的实现有一些额外的微妙处理边缘情况):

Monitor.Enter(obj)
  ...
try {
} finally {
  Monitor.Exit(obj);
}

使用每种引用类型中的字段来保存Monitor使用的状态。


正如Marc所说,考虑ReaderWriterLockSlim,除非你需要ReaderWriterLock给出的公平性(线程保证以他们开始等待的顺序进入)。