问题标签 [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 投票
2 回答
795 浏览

c# - Is ReaderWriterLockSlim resistant to ThreadAbortException?

I would like to check whether following code is resistant against ThreadAbortException and will not lead into orphan lock. If it is not, what is the best pattern to avoid orphan locks here?

According following link http://chabster.blogspot.cz/2013/07/a-story-of-orphaned-readerwriterlockslim.html, there is (or at least there was) possible way how to create orphan locks but I was running sample code for a while without any luck.

I am using .NET 4.0

Is there any difference between behavior in Debug and Release?

0 投票
2 回答
215 浏览

c# - 不打开锁的最佳实践

关于 ReaderWriterLockSlim的Albahari Threading部分显示了此储物柜的用法。但是没有任何 try-catch 和 finally 阻止例外情况。

为什么他没有使用异常处理来不留下打开的锁?在下面的示例中,如果 DivideBy 参数为 0,则写锁保持打开状态。

所以他试图简单地展示用法而不是让例子变得复杂?如果是这样,处理这个问题的最佳做法是什么?如果它被持有,我们应该总是使用 finally 块作为退出锁吗?

0 投票
2 回答
1090 浏览

c# - 使用 ReaderWriterLockSlim.EnterXXX() 的模式和随后的 try-finally 子句是否完全安全

MSDN 文档和许多使用ReaderWriterLockSlim类的示例建议使用以下模式:

但我很好奇它是否完全安全。是否有可能在获取锁之后,但在语句之前发生一些异常,try从而使锁卡在锁定状态?最明显的候选人是ThreadAbortException。我知道这种情况发生的可能性非常小,但后果非常糟糕——所以我认为值得考虑。我不相信编译器理解这种模式并防止处理器在try语句之前中断线程。

如果理论上有这种代码不安全的可能性,有没有办法让它更安全?

0 投票
1 回答
384 浏览

c# - TPL 任务和 ReaderWriterLockSlim

我当前的项目中有一个奇怪的错误。这就是为什么我有两个问题:

1)为什么会发生这种情况?
2)我该如何解决这个问题?

一些附加信息:我在具有 QuadCore CPU (Intel Core2Quad Q9650) 的系统上运行它

我有一个可以一次从多个线程调用的函数“DoSomething()”:

为了测试这个函数是否有效,我使用 TPL 创建了多个几乎同时调用这个函数的任务:

我希望得到这样的输出:

,假,假,……

但我得到的是:

真、真、真、真、假、假……

记住:
1)为什么?
2)如何解决?

编辑:我添加了一个示例项目:[已删除 - 问题已解决]

0 投票
1 回答
204 浏览

c# - “重新实现”(克隆)ReaderWriterLockSlim

我们的 Web 应用程序中有几个 full lock-s,如果将它们替换为读写锁,它们的性能可能会更高——即使有 RW 锁的额外开销,我们的代码也会更加并行。不幸的是,我不能使用ReaderWriterLockSlim,因为它看起来像一个相当大的同步错误,可能导致某些硬件上的死锁。这篇文章非常详细地解释了这个问题。

上述问题似乎已在 .NET Framework 4.0.30319.33440 中得到修复,但并非所有 Windows 服务器版本都得到此修复。Windows 8.1 和 Windows Server 2012 R2 已修复。Windows Server 2012(不是 R2)和 Windows Server 2008 R2 仍然存在错误,即使在最新补丁之后。看起来微软不打算在所有平台上解决这个问题。

我们的各种服务器环境使用不同版本的 Windows Server,我已经确认有些服务器有修复,而有些则没有。这意味着我不能安全地将所有这些lock语句更改为读写器锁,因为在我们的某些服务器上,应用程序可能会随机死锁。

作为替代方案,我正在研究ReaderWriterLockSlim通过反编译 System.Core 中的代码并创建一个新类(类似于MyRWLock)来重新实现,该类修复了一个(已知)错误功能ExitMyLock。所有其他代码与原始代码相同ReaderWriterLockSlim

这需要删除所有__DynamicallyInvokable属性并添加 2 或 3 个内部的类/结构System.Core。我做了所有这一切,并让新的锁类编译没有错误。

我的问题是:谁能想到这个新课程不能像原来的ReaderWriterLockSlim课程那样工作的任何原因?我认为自己在线程方面相当出色,但我不是专家。由于我没有更改任何代码(除了修复一些类型名称以指向新MyRWLock的而不是ReaderWriterLockSlim属性),我相信这应该可行。但是,我确实想知道,如果我忘记了一些可能会以各种难以调试的有趣方式破坏这一点的东西。

或者:我(和链接的文章)的理解是错误的吗?这个问题不需要首先解决吗?那篇文章的作者似乎做了一个非常详细的分析,这对我来说是正确的,但微软并未将更改应用于某些 Windows Server 版本。

对此的任何想法将不胜感激。

编辑

要为全锁添加更多上下文,这就是它们的用途。我们有一个服务,它在执行其工作时读取/写入远程服务。读比写多得多。一次读取涉及到 1 次网络往返,一次写入涉及到远程服务的 3 次网络往返。当发生写入时,可能不会发生读取(写入实际上是读取->删除->添加)。现在,我们对lock所有这些操作都使用 full -s ,但这意味着所有尝试读取的线程仍然必须排队,直到当前读取完成,即使没有写入。在我看来,RW 锁将是理想的选择。

0 投票
1 回答
161 浏览

c# - ReaderWriterLockSlim 和计时器

我对 ReaderWriterLockSlim 和延迟 ExitWriteLock 感到沮丧。为什么定时器回调中释放了WriteLock?

0 投票
1 回答
185 浏览

c# - System.Threading.ReaderWriterLockSlim

这句话是真是假?

它针对来自多个来源的写入很常见的使用进行了优化

ReaderWriterLockSlim 允许线程为读或写锁定并且只锁定一个。但是关于许多线程 - 是否允许 2 个线程锁定自身?我很困惑...

0 投票
0 回答
418 浏览

c# - ReaderWriterLock 允许饥饿

以下代码未完成,因为第二个读取器 (tRead2) 无法获取锁。

我没想到会出现这种情况,我认为既然 writer (tWrite) 无法获得锁,那么 tRead2 将被允许这样做(并且 tWrite 会等到所有读取模式的锁都被释放)。我将这种出乎意料的行为解释为不允许作家挨饿的一种方式。

是否有任何同步结构允许 tRead2 获得锁(即使 tWrite 可能被饿死)?

0 投票
1 回答
1866 浏览

c# - ConcurrentBag 与自定义线程安全列表

我有一个 .NET 4.5 单实例 WCF 服务,它维护一个列表中的项目集合,该列表将同时具有并发的读取器和写入器,但读取器比写入器多得多。

我目前正在决定是使用 BCLConcurrentBag<T>还是使用我自己的自定义通用ThreadSafeList类(它扩展IList<T>和封装了 BCL ReaderWriterLockSlim,因为它更适合多个并发读取器)。

通过模拟 100 万个读者(简单地运行 Sum Linq 查询)和只有 100 个写者(将项目添加到列表中)的并发场景来测试这些实现时,我发现了许多性能差异。

对于我的性能测试,我有一个任务列表:

测试 1:如果我使用以下代码创建 1m 个读取器任务,然后创建 100 个写入器任务:

我得到以下计时结果:

  • 并发包:~300ms
  • 线程安全列表:~520ms

测试 2:但是,如果我创建 1m 个读取器任务和 100 个写入器任务(其中要执行的任务列表可能是 {Reader,Reader,Writer,Reader,Reader,Writer 等}

我得到以下计时结果:

  • 并发包:~4000ms
  • 线程安全列表:~800ms

我获取每个测试的执行时间的代码如下:

测试 1 中 ConcurrentBag 的效率更好,测试 2 中 ConcurrentBag 的效率比我的自定义实现差,因此我发现使用哪个是一个艰难的决定。

Q1。当我唯一改变的是列表中任务的顺序时,为什么结果如此不同?

Q2。有没有更好的方法来更改我的测试以使其更公平?

0 投票
0 回答
161 浏览

c# - ReaderWriterLockSlim.TryEnterUpgradeableReadLock(0) 被阻塞

在我的 .Net 应用程序中,我有一个地方声明ReaderWriterLockSlim

在其他地方,我每 100 毫秒刷新一次值,所以基本上如果有一次,锁无法访问,这没什么大不了的,我只想退出并等待下一次调用。

所以我有以下方法的内容:

在应用程序中,我目前遇到了死锁(这似乎与当前的问题无关),所以我暂停了我的应用程序以检查线程,我看到我目前有 20 多个线程被阻塞if 条件。

这很奇怪,因为文档对此非常清楚:

如果 millisecondsTimeout 为 0(零),则此方法检查锁定状态,如果所需状态不可用,则立即返回 false。

问题很简单。为什么YYYYYYYYYYYYYYYYYY?我试图在TryEnterUpgradeable, 之后放置断点以继续,但这不起作用。