你如何找到锁的所有者(监视器)?

时间:2011-02-27 18:28:39

标签: c# .net multithreading monitor

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

2 个答案:

答案 0 :(得分:8)

没有。只需编写代码:

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。当然你不应该这样做。

答案 1 :(得分:0)

已编辑:

C#:

对于C#,你可以在这里得到答案:

来自Hans Passant

class Test {
    private object locker = new object();
    public void Run() {
        lock (locker) {  // <== breakpoint here
            Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
        }
    }
}