【发布时间】:2011-05-05 04:57:20
【问题描述】:
我使用 .Net Mutex 类跨线程锁定我的应用程序的某些部分。我遇到了一些死锁问题,如果我能找出当前拥有锁的线程的名称将会非常有帮助。
有没有简单的方法可以做到这一点?
【问题讨论】:
标签: .net multithreading deadlock mutex
我使用 .Net Mutex 类跨线程锁定我的应用程序的某些部分。我遇到了一些死锁问题,如果我能找出当前拥有锁的线程的名称将会非常有帮助。
有没有简单的方法可以做到这一点?
【问题讨论】:
标签: .net multithreading deadlock mutex
你不能,Mutex 是原生 Windows 句柄的包装器。 Windows 会混淆句柄值以防止任何人窥探内部内核结构。
为您的代码添加检测。每次获取互斥锁时,很容易存储线程的 ManagedId 或 Name 的值。日志记录通常对解决线程问题很有用,尽管它很危险,因为它会极大地影响线程的计时。 VS2010 Ultimate 版有一个名为Concurrency Visualizer 的漂亮插件。
【讨论】:
您可以基于Mutux 创建自己的锁类。显然,您希望尽可能保持二进制兼容,以便您可以轻松地将代码中的现有引用与新类交换。 WaitOne 和 ReleaseMutex 方法本质上只是调用真正的 Mutex,但添加日志记录或其他任何可能有助于调试的方法。
【讨论】: