首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何知道谁拥有ReaderWriterLockSlim?

如何知道谁拥有ReaderWriterLockSlim?
EN

Stack Overflow用户
提问于 2012-05-24 04:21:29
回答 5查看 1.4K关注 0票数 3

我正在写一个广泛使用多线程的应用程序。一些线程使用ReaderWriterLockSlim共享一个可观察到的集合。

我经常遇到死锁,我需要知道在死锁发生时哪个线程持有该锁。我怎么知道呢?我看过对象的属性,没有什么明显的东西。目前我只知道哪些线程在等待锁。

谢谢你的帮忙!

编辑:当然,我说的是在调试时找到它,所有的调试信息都可用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-24 04:30:00

在死锁期间,只需在线程调试面板中查看当前线程,检查您的调用堆栈,您就会发现是哪个线程获得了锁。

如果你需要在你的代码中知道线程id,你可以静态地保存它,或者从readerwriterlockslim继承并添加一个线程属性。

票数 3
EN

Stack Overflow用户

发布于 2012-05-24 04:43:29

您总是可以尝试在锁定之前和之后跟踪线程ID,因此您已经记录了发生了什么以及谁锁定了它。您可以写入文件或仅在调试器输出窗口中签入,以查看所有跟踪。我相信您可以使用跟踪断点(命中时的断点-> ...)而不是真正的跟踪代码,以便在输出窗口中有快速的东西。

票数 2
EN

Stack Overflow用户

发布于 2012-05-24 05:12:58

ReaderWriterLockSlim不是密封的,所以您可以子类它并以这种方式附加您需要的任何信息。问题是有用的方法不是虚拟的,所以您不能覆盖它们。但是,您可以添加自己的方法,如EnterReadLockDebugExitReadLockDebug等,它们除了捕获调用方法的线程外,还会在幕后调用EnterReadLockExitReadLock。这不是一个很好的解决方案,因为您必须更改所有的调用点。但是,如果使用调试器太麻烦,那么这可能是一个合理的替代方案。

使用条件编译的主题有很多变体。您可以检测Debug与Release构建,并根据活动的构建配置注入必要的调试逻辑。当Debug处于活动状态时注入调试信息,当Release处于活动状态时忽略它。

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

https://stackoverflow.com/questions/10727243

复制
相关文章

相似问题

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