1

当您想使用 a 时ReaderWriterLock,您可以像这样声明它:

ReaderWriterLock rwLock = new ReaderWriterLock;

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

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

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

4

2 回答 2

2

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

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

另外 - 可能会ReaderWriterLockSlim在许多情况下考虑;更少的开销。重新跟进;在获取锁时,您正在更改内部状态(以线程安全的方式)以保持“多读者nand单写者”的期望(可能会阻塞直到可能发生,即冲突的锁已被撤销)。

于 2011-04-20T06:52:47.640 回答
2

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

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

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

你真的在锁定。

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

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

使用每个引用类型中的字段来保存Monitor.


正如 Marc 所指出的,ReaderWriterLockSlim除非您需要提供的公平性(线程保证按照它们开始等待的顺序进入),否则请考虑ReaderWriterLock

于 2011-04-20T07:06:38.570 回答