当您想使用ReaderWriterLock时,您可以这样声明它:
ReaderWriterLock rwLock = new ReaderWriterLock;
如果您要对所有要访问您想要保护的资源的不同线程执行这些操作,那么它们(大概)都在使用不同的ReaderWriterLock实例。
ReaderWriterLock实例如何在线程之间共享?
另外,作为奖励,有人能为我确认您真正“锁定”的是ReaderWriterLock状态,而不是任何资源。与lock(someResourceToLock)不同的是,除了ReaderWriterLock实例的状态(无论是读还是写模式,以及是否允许读写),您不会锁定任何东西。
发布于 2011-04-20 06:52:47
如果您使用的是每个线程的ReaderWriterLock rwLock = new ReaderWriterLock (每线程)或每个方法(即作为方法变量)的,那么您的代码很可能会中断。它不是单例;它依赖于使用同一个锁访问受保护数据的所有线程。这通常是通过将锁放置在字段中来实现的,即
class Foo {
ReaderWriterLock rwLock = new ReaderWriterLock();
// lots of code accessing the rwLock field for this instance
}而且--也许在许多情况下考虑ReaderWriterLockSlim;减少开销。您的跟踪;在获取锁时,您正在更改内部状态(以线程安全的方式),以保持“多读者nand单作者”的期望(可能会阻塞直到可能,即冲突锁已被撤回)。
发布于 2011-04-20 07:06:38
如何在线程之间共享ReaderWriterLock实例?
创建ReaderWriterLock的单个实例,并从访问要保护的共享资源的所有线程中使用它。
另外,作为奖励,
可以为我确认您真正“锁定”的是ReaderWriterLock状态,而不是任何资源。与锁(SomeResourceToLock)不同,除了ReaderWriterLock实例的状态之外,您没有锁定任何东西
你真的是在锁门。
lock(obj) { ... }只是一条捷径(这里简化了,实际的实现有一些额外的微妙之处来处理边缘情况):
Monitor.Enter(obj)
...
try {
} finally {
Monitor.Exit(obj);
}在每个引用类型中使用该字段来保存Monitor使用的状态。
正如Marc所指出的,请考虑ReaderWriterLockSlim,除非您需要ReaderWriterLock提供的公平性(线程保证按它们开始等待的顺序输入)。
https://stackoverflow.com/questions/5726463
复制相似问题