有没有一种方法可以发现当前拥有锁的线程? 具体来说,我正在寻找一些代码以打印阻止锁被获取的线程。我想尝试在给定的超时时间内进行锁定,然后报告哪个线程阻止了锁的获取。
有没有一种方法可以发现当前拥有锁的线程? 具体来说,我正在寻找一些代码以打印阻止锁被获取的线程。我想尝试在给定的超时时间内进行锁定,然后报告哪个线程阻止了锁的获取。
不需要解释,只需编写代码:
private int lockOwner;
private object lockObject = new object();
...
void foo() {
lock(lockObject) {
lockOwner = Thread.CurrentThread.ManagedThreadId;
// etc..
}
}
有一种未被记录的方法可以获取锁的拥有者,虽然不能保证一定成功,但通常都可以。当您有一个断点处于活动状态时,请使用“调试(Debug) + 窗口(Windows) + 内存(Memory) + 内存1(Memory1)”选项卡。在地址输入框中,键入锁定对象的名称("lockObject"),然后按Enter键。地址框会更改为内存中对象的地址。编辑并在地址末尾添加 "-4",然后按Enter键。转储中的前4个字节以十六进制形式给出了受管线程ID。这对32位代码有效,只要您从未在锁定对象上调用过GetHashCode()函数,当然您不应该这样做。
lockObject
的类型。 - Lasse V. Karlsen编辑:
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);
}
}
}