我正在写一个广泛使用多线程的应用程序。一些线程使用ReaderWriterLockSlim共享一个可观察到的集合。
我经常遇到死锁,我需要知道在死锁发生时哪个线程持有该锁。我怎么知道呢?我看过对象的属性,没有什么明显的东西。目前我只知道哪些线程在等待锁。
谢谢你的帮忙!
编辑:当然,我说的是在调试时找到它,所有的调试信息都可用。
发布于 2012-05-24 04:30:00
在死锁期间,只需在线程调试面板中查看当前线程,检查您的调用堆栈,您就会发现是哪个线程获得了锁。
如果你需要在你的代码中知道线程id,你可以静态地保存它,或者从readerwriterlockslim继承并添加一个线程属性。
发布于 2012-05-24 04:43:29
您总是可以尝试在锁定之前和之后跟踪线程ID,因此您已经记录了发生了什么以及谁锁定了它。您可以写入文件或仅在调试器输出窗口中签入,以查看所有跟踪。我相信您可以使用跟踪断点(命中时的断点-> ...)而不是真正的跟踪代码,以便在输出窗口中有快速的东西。
发布于 2012-05-24 05:12:58
ReaderWriterLockSlim不是密封的,所以您可以子类它并以这种方式附加您需要的任何信息。问题是有用的方法不是虚拟的,所以您不能覆盖它们。但是,您可以添加自己的方法,如EnterReadLockDebug和ExitReadLockDebug等,它们除了捕获调用方法的线程外,还会在幕后调用EnterReadLock和ExitReadLock。这不是一个很好的解决方案,因为您必须更改所有的调用点。但是,如果使用调试器太麻烦,那么这可能是一个合理的替代方案。
使用条件编译的主题有很多变体。您可以检测Debug与Release构建,并根据活动的构建配置注入必要的调试逻辑。当Debug处于活动状态时注入调试信息,当Release处于活动状态时忽略它。
https://stackoverflow.com/questions/10727243
复制相似问题