2011-02-27 10 views
6

현재 스레드가 어떤 스레드를 소유하고 있는지 발견하는 방법이 있습니까? 특히 잠금이 걸리지 않도록하는 스레드를 인쇄하는 코드를 찾고 있습니다. 나는 주어진 타임 아웃을 위해 잠금을 시도한 다음, 어떤 스레드가 잠금을 차단하고 있는지보고하려고한다. 잠금 소유자를 얻을 수있는 다른 문서화되지 않은 방법은, 일반적으로 작동이 보장되지 않고,이자물쇠 (모니터)의 소유자를 어떻게 찾을 수 있습니까?

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

가 수행합니다

+0

왜 C#에 특정한가요? 자바의 경우에는 같은 의심 일 수 있습니다. –

+1

@Mask 문제는 아마도 스레드와 잠금 기능을 가진 모든/대부분의 런타임/언어에 존재할 것입니다.하지만 그는 특별히 코드를 요구합니다. –

답변

7

번호는 그냥 코드를 작성합니다. 중단 점을 활성화하면 Debug + Windows + Memory + Memory1을 사용하십시오. 주소 입력 상자에 잠금 개체의 이름 ("lockObject")을 입력하고 Enter 키를 누릅니다. 주소 상자가 메모리에있는 개체의 주소로 변경됩니다. 주소를 편집하고 "-4"를 주소에 추가하고 Enter 키를 누릅니다. 덤프의 처음 4 바이트는 ManagedThreadId를 16 진수로 제공합니다. 이것은 잠금 객체에서 GetHashCode를 호출하지 않는 한 32 비트 코드에서 작동합니다. 물론 당신은하지 말아야합니다.

+0

'lockObject'의 타입을 고치고 싶을지도 모릅니다. –

+0

잠금에 사용되는 개체에서 GetHashCode()를 호출하면 안된다는 설명을 할 수 있습니까? 당신은 일반적으로 또는 단지이 추억의 목적을 위해 말하고 있습니까? – crokusek

1

편집 :

C 번호 :

, 당신은 여기에 답을 얻을 수 있습니다 : Hans Passant에서

,

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

C#에서 java.util.concurrent가 어떻게 도움이됩니까? –

+0

@Lasse : 질문은 C#에만 한정되어서는 안됩니다. java의 경우에는 동일한의 L가 될 수 있습니다. 내 답변은 Java와 관련이있다 –

+2

죄송합니다.하지만 .NET 프로그램에 대한 답변이 필요한 경우 .NET 및 C#에 대한 질문을 전적으로받을 수 있습니다. Java 프로그램에 대한 대답을 원한다면 직접 질문해야합니다. 귀하의 제안 된 편집을 거부하여 자바 태그를 추가했습니다. 이 .NET 질문입니다, 문제는 아마 자바 및 다른 런타임/언어, 많은 존재하지만 일반적인 대답을 원하는 경우 자신의 질문을 물어보십시오. –

관련 문제