c# - 你如何找到锁的所有者(Monitor)?

标签 c# .net multithreading monitor

有没有办法发现哪个线程当前拥有锁? 具体来说,我正在寻找一些代码来打印出阻止获取锁的线程。我想尝试锁定给定的超时时间,然后报告哪个线程正在阻止获取锁定。

最佳答案

没有。直接写代码:

private int lockOwner;
private object lockObject = new object();
...
void foo() {
    lock(lockObject) {
        lockOwner = Thread.CurrentThread.ManagedThreadId;
        // etc..
    }
}

有一种其他未记录的方法来获取锁的所有者,它不能保证有效但通常有效。当你有一个断点事件时使用 Debug + Windows + Memory + Memory1。在“地址”输入框中,键入锁定对象的名称(“lockObject”)并按 Enter。地址框变为对象在内存中的地址。编辑它并将“-4”附加到地址,然后按 Enter 键。转储中的前 4 个字节为您提供十六进制的 ManagedThreadId。这适用于 32 位代码,只要您从未对锁定对象调用 GetHashCode。你当然不应该这样做。

关于c# - 你如何找到锁的所有者(Monitor)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135013/

相关文章:

c# - 如何硬编码 WCF 配置?

java - 使用 Java 代码访问 .NET dll 的方法

c++ - std::shared_ptr 在线程中使用时崩溃

c# - itextsharp 意外错误

c# - 如何通过使代码变暗而不是 3 个点来恢复 Visual Studio 的旧方式提醒建议?

c# - 在通用方法中传递/指定一个属性?

c# - Reporting Services 2005 报告各部分后带有免责声明页面

c# - 从同名节点获取值

ios - 如何在应用程序在后台运行时监听锁定/解锁电话事件?