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

Tim*_*ley 8 .net c# multithreading monitor

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

Han*_*ant 8

不.只需编写代码:

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

有一个没有记录的方法来获得锁拥有者,它不能保证工作,但通常会.当您有一个断点活动时,使用Debug + Windows + Memory + Memory1.在"地址"输入框中,键入锁定对象的名称("lockObject"),然后按Enter键.地址框更改为内存中对象的地址.编辑它并在地址后附加"-4",按Enter键.转储中的前4个字节为您提供十六进制的ManagedThreadId.这适用于32位代码,只要您从未在锁定对象上调用GetHashCode.当然你不应该这样.