2011-10-20 6 views
3

다음과 같은 코드가 있습니다. 교착 상태가 발생합니까?교착 상태 만들기

private readonly object objectLock = new object(); 

public void MethodA() 
{ 
    lock(objectLock) 
    { 
     MethodB(); 
    } 
} 

public void MethodB() 
{ 
    lock(objectLock) 
    { 
     //do something 
    } 
} 

UPDATE : 아니, 당신은 교착 수 있도록 두 개의 잠금 객체를 필요할 것

답변

5

아니요 교착 상태가 아닙니다. 동일한 동기화 객체에서 동일한 스레드 잠금. 스레드는 중첩 된 잠금을 사용할 수 있습니다. 동등한 번호를 풀어 줘야합니다. 시대의.

+0

MethodA가 MethodB를 두 번 호출하면 어떻게 될까요? 그래도 괜찮을까요? – Jon

+0

그래, 여전히 괜찮을거야. 시도해 보았 니? 교착 상태가 발생하면 모든 스레드가 교착 상태에 빠지게됩니다. 단일 스레드로 교착 상태가 발생할 수 없습니다. 앱에 여러 개의 스레드가 있습니까? –

+0

죄송합니다. 내 질문이 업데이트되었습니다. 두 스레드가 있습니다. – Jon

3

2 개 스레드가 실행됩니다.

+3

두 스레드; p –

+0

죄송합니다. 질문에 2 개의 스레드가 추가되었습니다. – Jon

10

아니오 - 그러나 이것은 다음과 같습니다

private readonly object objectLockA = new object(); 
private readonly object objectLockB = new object(); 

public void MethodA() 
{ 
    lock(objectLockA) 
    { 
    lock(objectLockB) 
    { 
     //... 
    } 
    } 
} 

public void MethodB() 
{ 
    lock(objectLockB) 
    { 
    lock(objectLockA) 
    { 
     //do something 
    } 
    } 
} 

당신은 당신이 교착 상태를 얻을 것 (2 개 다른 스레드에서) 병렬로 두 가지 방법을 호출하면 ...

3

이 유일한 뮤텍스 인 경우 참여, 그렇지 않습니다. 동일한 스레드는 동일한 뮤텍스를 여러 번 잠글 수 있습니다 (같은 수의 잠금을 해제하는 한). MethodA를 호출

는 동일한 스레드에서 작업의 다음과 같은 순서를 생성합니다

  • 잠금 objectLock을.
  • MethodB으로 전화하십시오.
  • 잠금 objectLock.
  • 잠금 해제 objectLock.
  • 출구 MethodB.
  • 잠금 해제 objectLock.

그래서, objectLock 두 번 잠겨 두 번 unlocaked 있지만 교착 상태가 없습니다 : 다른 스레드가 단순히 첫 번째 잠금을 차단합니다 MethodA 전화를 시도하지만 교착하지 않을 경우

  • 은.
  • MethodB으로 전화하면 같은 일이 발생합니다.
  • 첫 번째 스레드가 MethodB을 호출하고 다른 스레드가 MethodA을 호출하면 다시 "정상적인"블로킹이 발생하지만 교착 상태는 발생하지 않습니다.