问题标签 [readerwriterlockslim]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - IDisposable 和 ReaderWriterLockSlim
我有一堂课MyClass
。这个类有一个字段:(public ReaderWriterLockSlim rw;
公共的更简单的示例代码)。MyClass
许多线程可以从usingrw.EnterReadLock
等 中读取数据。
我也实现了IDisposable
接口:
如您所见,问题是MyClass
当第二个线程调用Dispose
myClass 对象时,一个线程正在使用。我无法处置 ReaderWriterLockSlim,因为它会使我的应用程序崩溃。那么我应该删除那些释放托管资源的行吗?反正 ReaderWriterLockSlim 会在不久的将来被 GC 收集,对吧?(但是这个类资源贵吗?)。
也许我应该在 Dispose 方法或其他东西中添加一些 lock(syncObject) ?
编辑:我也处理 AllocHGlobal,所以我需要等待,直到所有线程停止读取/写入myClass
.
不同的观点:
visual-studio-2012 - 带有 C++/CLI 的 System::Threading 命名空间中缺少 ReaderWriterLockSlim
我最近安装了 Visual Studio 2012 并尝试重新编译一个现有项目,该项目是一个混合模式 C++ 应用程序,带有一点 C++/cli 用于访问应用程序所需的 .net 程序集。
C++/CLI 实现的一部分使用 ReaderWriterLockSlim 类来保护从多个线程访问字典。
这一切都可以编译并与 VS2010 一起正常工作。然而,在升级到 VS0212 和 .Net 4.5 后,该项目现在无法编译,因为它在 System::Threading 命名空间中找不到 ReaderWriterLockSlim。
我相当确定安装很好,因为我可以创建一个新的 C# 项目并使用 ReaderWriterLockSlim 没有任何问题。
下面显示的新 C++ 项目也失败了。我在此处或 google 上都找不到对 C++/CLI 用户故意删除的此类的任何引用。有没有其他人有过类似的经历。
c# - c# ReaderWriterLockSlim 在调用 ExitReadLock 的中断线程后损坏
我遇到了 ReaderWriterLockSlim 在一系列法律行动后似乎被破坏的场景。
流程是:
- 线程 1 需要写入器 lock1
- 线程 2 尝试获取读卡器 lock1 - 块
- 线程 2 被中断,调用 lock1.ExitReadLock 线程 2 没有获得锁。似乎应该抛出异常。
- 线程 1 退出 lock1 的写入者锁
- 任何试图获取 lock1.EnterReadLock 的线程都将永远阻塞
在上面的第 3 阶段之后,调试器显示 lock1.CurrentReadCount 已损坏 - 似乎已溢出到 0x7FFFFFF。
我想知道是否有人遇到过这种情况,或者我可能遗漏了一些东西。
重现它的代码:
.net - ReaderWriterLockSlim(不是那么苗条)替换,递归,可升级读取?
不知何故ReaderWriterLockSlim
,我们的代码中有很多。它们每个都占用6K内存,因此这已成为一个大问题。
作为一个快速修复,我正在寻找一个内存消耗较少的替代品。我正在尝试Joe Duffy 的 RW-lock,但它不可升级和写递归(而且很难做到)。
还有其他更多的记忆灯替代品吗?
c# - 微软对 ReaderWriterLockSlim.IsReadLockHeld/IsWriteLockHeld 的备注及其后果
为了同步对我的属性的访问,我使用了ReaderWriterLockSlim类。我使用以下代码以线程安全的方式访问我的属性。
为了避免在获取或设置多个属性时出现不必要的锁定,一旦我发布了ReaderWriterLockSlim
-Object 并在每次我要获取或设置一堆属性时从类外部锁定它。为了实现这一点,我的 getter 和 setter 方法检查是否已使用IsReadLockHeld
属性IsWriteLockHeld
和ReaderWriterLockSlim
. 这工作正常,并提高了我的代码的性能。
到目前为止一切都很好,但是当我重新阅读有关文档时IsReadLockHeld
,IsWriteLockHeld
我注意到 Microsoft 的评论:
此属性旨在用于断言或其他调试目的。不要用它来控制程序执行的流程。
我的问题是:我有理由不IsReadLockHeld/IsWriteLockHeld
为此目的使用吗?我的代码有什么问题吗?一切都按预期工作,并且比使用递归锁 ( ) 快得多LockRecursionPolicy.SupportsRecursion
。
为了澄清这一点:这是一个最小的例子。我不想知道锁本身是否是必要的,或者是否可以删除或以不同的方式实现。我只想知道为什么我不应该使用IsReadLockHeld
/IsWriteLockHeld
来控制文档中所述的程序流。
c# - 使用 ReaderWriterLockSlim 进行多线程更新
我想当我第一次开始设计我的游戏时我犯了一个巨大的错误,我会给你我的部分甚至全部代码,但它太复杂了。所以请多多包涵。
现在我进入了更高级的设计阶段,我在线程方面遇到了很大的麻烦。
在更新期间,我同时运行 3 个任务。更新、HitTesting 和 AI 甚至被拆分为更多线程。
- 更新需要对我的所有对象进行移动(包括物理)和动画。
- HitTesting 在数千个对象之间进行所有 Hit 测试,但仍需要大量优化……。诸如分而治之之类的事情是正确的。
- AI 向更新周期执行的对象发出命令。像左转或右转,火灾等。
当然我们有
- 绘制……或者在我的情况下,绘制期间的 GetSprites。除了更新过程之外,它必须具有所有优先级。
- 还有尚未实现的声音和信息系统。
正如您所看到的,这不是多任务处理的最佳过程,因为它们都在相同的对象上运行,但它必须如此。
所以……我想实现 System.Threading.ReaderWriterLockSlim
这是我真正的问题:我该怎么做?
- 因为更新是我绘制数据的唯一作者。
- 绘图是一个纯粹的阅读器
- HitTesting 可能需要重新计算 boundingRectangle 和 Matrix 但这不会影响绘图
- AI 只需要读取位置数据并发出命令,在下一个周期由 Update 读取并被分隔在一组单独的类中(我称之为 master/puppet,但可能有一个官方/更好的名称)
实现不同的 ReaderWriterLockSlim 对象来锁定线程可能需要的不同属性是否有意义?
我想在更新期间进行控制以绕过锁定的对象(通过 AI 或 HitTesting)并获取下一个对象,以便稍后在解锁时进行操作(或者如果更新花费的时间太长,甚至可以跳过它,但要这样做在下一个周期)
你们中有人知道有关高级线程的书籍或网站吗?不是我到处都能找到的常见小例子,所以我可以弄清楚吗?
我已经被困了一个多星期了,我想继续。
任何帮助表示赞赏。
这是我用于对象之间的碰撞检测的代码。我从很久以前找到的 c++ 示例转换它,但不记得在哪里。
iSpriteInfo 是这样定义的
multithreading - ReaderWriter Lock,我的代码只是给出了异常
我正在尝试实现 Reader Writer Problem .. 我不知道它有什么问题?
谁能帮我弄清楚为什么?
..................................................... .
它只是给了我越来越多的例外!如果我在没有线程等待的情况下调用 notify() 会有问题吗?
我认为不能在常量字符串或全局对象上调用 wait()。!我在这里见过这个!
.net - ReaderWriterLockSlim 被永久锁定
好时光,大家。
我的问题如下:
多个线程在等待一个事件获得读锁,一个线程在等待一个事件获得写锁。在那一刻,任何线程都没有持有锁。
来自 ReaderWriterLockSlim.cs:
首先,我假设线程中止会对锁的状态造成这种破坏。很容易重现该问题:http ://chabster.blogspot.com/2013/07/a-story-of-orphaned-readerwriterlockslim.html 。
我使锁用法看起来像
并且确定中止只能在 try { /* 资源使用代码 */ } 内发生。
现在我又遇到了同样问题的转储,但我没有想法了。
我必须说这在 24 个核心环境中不时发生。会不会是 ht/milticore/多处理器系统上的 RWLS 错误?我看到 ReaderWriterLockSlim 类在没有互锁指令的情况下更新它的成员,这可能是多核环境中的一个潜在问题。
PS:我想听听 ReaderWriterLockSlim 作者 Joe Duffy 的消息,但无法通过电子邮件联系到他。
c# - ReaderWriterLockSlim.EnterUpgradeableReadLock() 总是死锁?
我非常熟悉,ReaderWriterLockSlim
但最近尝试EnterUpgradeableReadLock()
在一个类中实现......在我意识到当 2 个或更多线程运行代码时,这几乎肯定是一个有保证的死锁之后不久:
我在这里想念什么?
编辑
添加了我的场景的代码示例。该Run()
方法将被 2 个或更多线程同时调用。
debugging - 确定哪个方法持有 ReaderWriterLockSlim WriteLock
目前我正在使用 WinDbg 分析转储。
我运行了以下命令(遵循Tess 令人难以置信的演练):
其中列出了所有线程的所有堆栈。有 300 个正在运行的线程或多或少具有相同的堆栈,所以我只是在这里打印一个堆栈...
然后我做了以下事情:
然后我正在寻找这个线程中的所有实例:
然后我尝试获取有关ReaderWriterLockSlim
-instance 的更多信息:
我已将owners
(2147483649)的值与此页面上的信息相匹配=0x80000001
但是如何识别持有锁的线程呢?