【问题标题】:How do you find the owner of a lock (Monitor)?您如何找到锁的所有者(监视器)?
【发布时间】:2011-07-05 08:02:54
【问题描述】:

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

【问题讨论】:

  • 为什么特定于 C# ?在 java 的情况下可能会有同样的疑问。
  • @Mask 这个问题可能存在于所有/大多数运行时/具有线程和锁定的语言中,但他特别要求提供代码。

标签: c# .net multithreading monitor


【解决方案1】:

没有。直接写代码:

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

【讨论】:

  • 您可能想要修复lockObject 的类型。
  • 您能解释一下不应该在用于锁定的对象上调用 GetHashCode() 吗?你是说一般情况还是只是为了这个记忆偷看的目的?
【解决方案2】:

已编辑:

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);
        }
    }
}

【讨论】:

  • java.util.concurrent 如何在 C# 中提供帮助?
  • @Lasse:这个问题不应该特定于 C#。在 java 的情况下,这可能是同样的疑问。我的答案与java有关
  • 很抱歉,如果他需要 .NET 程序的答案,那么他完全有权询问有关 .NET 和 C# 的问题。如果你想要一个 Java 程序的答案,你需要自己问。我拒绝了您建议的添加 java 标签的编辑。这是一个 .NET 问题,该问题可能存在于 java 和许多其他运行时/语言中,但如果您想要一个一般性的答案,请提出您自己的问题,不要试图把它变成不是的东西。
  • 既然他要代码,知道 Java 或 Objective-C 的代码或任何对他没有帮助的东西。我还假设(但我当然可能是错的),获取该信息所涉及的技术细节取决于运行时、语言、操作系统等,因此可能不存在通用的包罗万象的答案。
  • @Lasse:没问题。现在,我也回答了 C#。那怎么样?
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多