线程挂起,直到我附加调试器
Posted
技术标签:
【中文标题】线程挂起,直到我附加调试器【英文标题】:Threads hang until i attach debugger 【发布时间】:2018-01-19 16:54:21 【问题描述】:我有一个使用 WCF 的服务。在内部,它有一个字典,其中包含您可以添加到不同端点或从不同端点获取子集的列表。
代码是这样的:
List<Data> list = null;
try
locker.EnterReadLock();
list = internalData[Something].Where(x => x.hassomething()).ToList();
finally
locker.ExitReadLock();
foreach (var y in list)
result[y.proprty1].Add(y.property2); // <-- here it hangs
return result;
因此,internalData 使用 ReaderWriterLockSlim 锁定所有操作,readerlock 用于读取,writerlock 用于添加。我制作了锁内物品的副本,稍后再处理此副本。
问题是一段时间后,越来越多的 cpu-cores 达到 100%,最后是使用所有核心。它可以在停止之前完美运行数天和数百万次调用。
附加调试器并暂停显示一个踏板在添加到结果字典时挂起。但是一旦我恢复,所有线程都会继续,并且会释放大量内存。
当附加调试器、暂停和恢复会释放类似这样的东西时,是否会发生一些特别的事情?
【问题讨论】:
Look at the 'Some limitations: reliability' part 第三段读起来有点像你所描述的。 (100% CPU 占用)。您不使用lock( internalData[Something])
是否有特定原因?
我读的比写的多得多,所以我希望不止一个读者同时阅读,这不会只对锁定起作用。会看你的链接
嗯,当您从该列表中读取时,是否有可能另一个线程会将某些内容添加到同一列表中?因为只要您不向列表中添加/删除内容,您就不需要锁定它。如果您同时在不同线程中读取和写入相同的列表,最好使用Concurrent Namespace 中的内容
哦后续问题:您是否能够在附加调试器时重现此问题?这意味着如果您在 Visual Studio 中启动程序并让它运行,它是否也会在某个时候锁定?
另一个端点正在更改列表,所以我需要锁定。该问题在 Visual Studio 中无法重现,并且在生产服务器上间歇性发生。正如您在第一条评论中的链接中指出的那样,我已更改为另一个锁,并将查看它是否是阅读器内部的异常
【参考方案1】:
我将锁更改为 lock(something) code... ,挂起的问题就消失了。所以看起来我遇到了 Steffen Winkler 在他的评论中指出的问题。 http://joeduffyblog.com/2007/02/07/introducing-the-new-readerwriterlockslim-in-orcas/
【讨论】:
以上是关于线程挂起,直到我附加调试器的主要内容,如果未能解决你的问题,请参考以下文章