首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程之间如何共享ReaderWriterLock?它是用单例实现的吗?

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

Stack Overflow用户
提问于 2011-04-20 06:42:26
回答 2查看 426关注 0票数 1

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

ReaderWriterLock rwLock = new ReaderWriterLock;

如果您要对所有要访问您想要保护的资源的不同线程执行这些操作,那么它们(大概)都在使用不同的ReaderWriterLock实例。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-20 06:52:47

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

代码语言:javascript
复制
class Foo {
    ReaderWriterLock rwLock = new ReaderWriterLock();
    // lots of code accessing the rwLock field for this instance
}

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-20 07:06:38

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

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

另外,作为奖励,

可以为我确认您真正“锁定”的是ReaderWriterLock状态,而不是任何资源。与锁(SomeResourceToLock)不同,除了ReaderWriterLock实例的状态之外,您没有锁定任何东西

你真的是在锁门。

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

代码语言:javascript
复制
Monitor.Enter(obj)
  ...
try {
} finally {
  Monitor.Exit(obj);
}

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5726463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档