问题标签 [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.

0 投票
1 回答
1533 浏览

c# - IDisposable 和 ReaderWriterLockSlim

我有一堂课MyClass。这个类有一个字段:(public ReaderWriterLockSlim rw;公共的更简单的示例代码)。MyClass许多线程可以从usingrw.EnterReadLock等 中读取数据。

我也实现了IDisposable接口:

如您所见,问题是MyClass当第二个线程调用DisposemyClass 对象时,一个线程正在使用。我无法处置 ReaderWriterLockSlim,因为它会使我的应用程序崩溃。那么我应该删除那些释放托管资源的行吗?反正 ReaderWriterLockSlim 会在不久的将来被 GC 收集,对吧?(但是这个类资源贵吗?)。
也许我应该在 Dispose 方法或其他东西中添加一些 lock(syncObject) ?

编辑:我也处理 AllocHGlobal,所以我需要等待,直到所有线程停止读取/写入myClass.

不同的观点:

0 投票
1 回答
841 浏览

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 用户故意删除的此类的任何引用。有没有其他人有过类似的经历。

0 投票
3 回答
1939 浏览

c# - c# ReaderWriterLockSlim 在调用 ExitReadLock 的中断线程后损坏

我遇到了 ReaderWriterLockSlim 在一系列法律行动后似乎被破坏的场景。

流程是:

  1. 线程 1 需要写入器 lock1
  2. 线程 2 尝试获取读卡器 lock1 - 块
  3. 线程 2 被中断,调用 lock1.ExitReadLock 线程 2 没有获得锁。似乎应该抛出异常。
  4. 线程 1 退出 lock1 的写入者锁
  5. 任何试图获取 lock1.EnterReadLock 的线程都将永远阻塞

在上面的第 3 阶段之后,调试器显示 lock1.CurrentReadCount 已损坏 - 似乎已溢出到 0x7FFFFFF。

我想知道是否有人遇到过这种情况,或者我可能遗漏了一些东西。

重现它的代码:

0 投票
2 回答
257 浏览

.net - ReaderWriterLockSlim(不是那么苗条)替换,递归,可升级读取?

不知何故ReaderWriterLockSlim,我们的代码中有很多。它们每个都占用6K内存,因此这已成为一个大问题。

作为一个快速修复,我正在寻找一个内存消耗较少的替代品。我正在尝试Joe Duffy 的 RW-lock,但它不可升级和写递归(而且很难做到)。

还有其他更多的记忆灯替代品吗?

0 投票
2 回答
2194 浏览

c# - 微软对 ReaderWriterLockSlim.IsReadLockHeld/IsWriteLockHeld 的备注及其后果

为了同步对我的属性的访问,我使用了ReaderWriterLockSlim类。我使用以下代码以线程安全的方式访问我的属性。

为了避免在获取或设置多个属性时出现不必要的锁定,一旦我发布了ReaderWriterLockSlim-Object 并在每次我要获取或设置一堆属性时从类外部锁定它。为了实现这一点,我的 getter 和 setter 方法检查是否已使用IsReadLockHeld属性IsWriteLockHeldReaderWriterLockSlim. 这工作正常,并提高了我的代码的性能。

到目前为止一切都很好,但是当我重新阅读有关文档时IsReadLockHeldIsWriteLockHeld我注意到 Microsoft 的评论:

此属性旨在用于断言或其他调试目的。不要用它来控制程序执行的流程。

我的问题是:我有理由不IsReadLockHeld/IsWriteLockHeld为此目的使用吗?我的代码有什么问题吗?一切都按预期工作,并且比使用递归锁 ( ) 快得多LockRecursionPolicy.SupportsRecursion

为了澄清这一点:这是一个最小的例子。我不想知道锁本身是否是必要的,或者是否可以删除或以不同的方式实现。我只想知道为什么我不应该使用IsReadLockHeld/IsWriteLockHeld来控制文档中所述的程序流。

0 投票
2 回答
263 浏览

c# - 使用 ReaderWriterLockSlim 进行多线程更新

我想当我第一次开始设计我的游戏时我犯了一个巨大的错误,我会给你我的部分甚至全部代码,但它太复杂了。所以请多多包涵。

现在我进入了更高级的设计阶段,我在线程方面遇到了很大的麻烦。

在更新期间,我同时运行 3 个任务。更新、HitTesting 和 AI 甚至被拆分为更多线程。

  • 更新需要对我的所有对象进行移动(包括物理)和动画。
  • HitTesting 在数千个对象之间进行所有 Hit 测试,但仍需要大量优化……。诸如分而治之之类的事情是正确的。
  • AI 向更新周期执行的对象发出命令。像左转或右转,火灾等。

当然我们有

  • 绘制……或者在我的情况下,绘制期间的 GetSprites。除了更新过程之外,它必须具有所有优先级。
  • 还有尚未实现的声音和信息系统。

正如您所看到的,这不是多任务处理的最佳过程,因为它们都在相同的对象上运行,但它必须如此。

所以……我想实现 System.Threading.ReaderWriterLockSlim

这是我真正的问题:我该怎么做?

  • 因为更新是我绘制数据的唯一作者。
  • 绘图是一个纯粹的阅读器
  • HitTesting 可能需要重新计算 boundingRectangle 和 Matrix 但这不会影响绘图
  • AI 只需要读取位置数据并发出命令,在下一个周期由 Update 读取并被分隔在一组单独的类中(我称之为 master/puppet,但可能有一个官方/更好的名称)

实现不同的 ReaderWriterLockSlim 对象来锁定线程可能需要的不同属性是否有意义?

我想在更新期间进行控制以绕过锁定的对象(通过 AI 或 HitTesting)并获取下一个对象,以便稍后在解锁时进行操作(或者如果更新花费的时间太长,甚至可以跳过它,但要这样做在下一个周期)

你们中有人知道有关高级线程的书籍或网站吗?不是我到处都能找到的常见小例子,所以我可以弄清楚吗?

我已经被困了一个多星期了,我想继续。

任何帮助表示赞赏。

这是我用于对象之间的碰撞检测的代码。我从很久以前找到的 c++ 示例转换它,但不记得在哪里。

iSpriteInfo 是这样定义的

0 投票
0 回答
51 浏览

multithreading - ReaderWriter Lock,我的代码只是给出了异常

我正在尝试实现 Reader Writer Problem .. 我不知道它有什么问题?
谁能帮我弄清楚为什么?

..................................................... .

它只是给了我越来越多的例外!如果我在没有线程等待的情况下调用 notify() 会有问题吗?

我认为不能在常量字符串或全局对象上调用 wait()。!我在这里见过这个!

0 投票
0 回答
346 浏览

.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 的消息,但无法通过电子邮件联系到他。

0 投票
3 回答
7170 浏览

c# - ReaderWriterLockSlim.EnterUpgradeableReadLock() 总是死锁?

我非常熟悉,ReaderWriterLockSlim但最近尝试EnterUpgradeableReadLock()在一个类中实现......在我意识到当 2 个或更多线程运行代码时,这几乎肯定是一个有保证的死锁之后不久:

我在这里想念什么?

编辑

添加了我的场景的代码示例。该Run()方法将被 2 个或更多线程同时调用。

0 投票
2 回答
2297 浏览

debugging - 确定哪个方法持有 ReaderWriterLockSlim WriteLock

目前我正在使用 WinDbg 分析转储。

我运行了以下命令(遵循Tess 令人难以置信的演练):

其中列出了所有线程的所有堆栈。有 300 个正在运行的线程或多或少具有相同的堆栈,所以我只是在这里打印一个堆栈...

然后我做了以下事情:

然后我正在寻找这个线程中的所有实例:

然后我尝试获取有关ReaderWriterLockSlim-instance 的更多信息:

我已将owners(2147483649)的值与此页面上的信息相匹配=0x80000001

但是如何识别持有锁的线程呢?